WorkQueue
Rev.2を表示中。最新版はこちら。
プロセスコンテキストで処理したい処理をWorkQueueに登録しておく。(タイマ割り込みだと割り込みコンテキストになってしまう)
WorkQueue毎にKernelThreadが存在し、そのKernelThreadが適宜workを処理する。
KernelThreadから起動されるのでworkはプロセスコンテキストで動作することになる。
KernelThreadの本体はworker_thread()
CPU毎にキューを持つ
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するのに使われる?