WorkQueue
Rev.4を表示中。最新版はこちら。
プロセスコンテキストで処理したい処理をWorkQueueに登録しておく。(タイマ割り込みだと割り込みコンテキストになってしまう)
WorkQueue毎にKernelThreadが存在し、そのKernelThreadが適宜workを処理する。KernelThreadから起動されるのでworkはプロセスコンテキストで動作することになる。キューはCPU毎に存在する。
KernelThreadの本体はworker_thread()。
struct workqueue_struct
+------------+
| |
| |struct cpu_workqueue_struct
+------------+ ------ +---------+
| cpu_wq[0] | | |
+------------+ | | struct work_struct
| cpu_wq[1] | \ |worklist | ---> +-------+ --->
+------------+ \ |more_work| | func |
: \ |work_done| | |
+------------+ \ | | +-------+
| cpu_wq[N] | \ | |
+------------+ \ +---------+
| |
| |
+------------+
カーネルスレッドの処理
worker_thread()
workがなくなったらscheduleをコールしてSleep
(WaitQueueはmore_workを使用)
run_workqueue()
worklistに連なっているworkについて
(1) work->func()を実行
(2) wake_up(&work_done)
<-- work_doneには何が積まれている?
flush処理がsleepするのに使われる?
[関連関数]
create_workqueue()
WorkQueueを作成する。
workqueue_structを作成し、WorkQueueを処理するカーネルスレッドを生成している。
workqueue_structを作成し、WorkQueueを処理するカーネルスレッドを生成している。
queue_work()
WorkQueueにwork_structを入れてカーネルスレッドをWakeupする。