0

我想在我的块设备驱动程序中排队多个struct task_struct s。在这里,每个task_struct将对应于一个用户级线程,它使用ioctl()系统调用将用户空间缓冲区发送到我的块设备驱动程序。一旦我排队多个task_struct s,我想保持它们在队列中,直到满足特定条件(即缓冲区已写入磁盘)。排队多个task_struct结构?

所以,我的问题是,如何排队多个task_struct,让他们睡觉,然后在满足某些条件时唤醒排队的子集task_struct

回答

0

您可以根据需要多次调用kthread_create来创建新线程,然后调用wake_up任意线程的任何子集。

+0

我没有创建任何内核线程。 Userland线程调用'ioctl()'。我想阻止每个线程对'ioctl()'的调用。由于同时调用多个线程会对'ioctl()'进行调用,因此我想排队与每个这些用户态线程对应的'task_struct',并调用某种形式的可中断睡眠。一旦条件满足,我想唤醒这些线程(至少它们的一部分)。我希望这能让我的问题更清楚? – user745878

+1

当然,每个用户线程都会输入你的'ioctl'函数,你可以让它们用'wait_event_interruptible()'或者其他什么来进入休眠状态。每次调用'ioctl'都会分配你想要保留的任何上下文(或者为每个文件分配一些上下文,或者其他任何内容),把它放在你想要的任何内部队列上(创建一个list和list_add,或者你想要的任何方式实现它),然后在准备就绪时为每个用户上下文调用'wake_up'。 – Roland

+0

感谢您的意见,罗兰!下一个问题是_context_本身。在我的代码中,多个256字节的缓冲区合并成一个4KB的页面。多个这样的4KB页面被作为单个“struct bio”(最多8个4KB页面)的一部分,然后提交给磁盘。一旦这个BIO被提供服务,我需要唤醒**所有**那些向BIO贡献256个字节的'task_struct'。那么,如何跟踪我需要唤醒的线程,因为可能有更多线程正在同时排队。 – user745878