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