Linux Device Driver - workqueue

前篇 : Linux Device Driver - tasklet


繼續先 7.7.5 work queue

1. struct work_struct : 定義在 <linux/workqueue.h>


2. INIT_WORK

INIT_WORK(struct work_struct *work, void (*function)(void *), void *data);
 一個函式搞定定義與初始化

和 tasklet 不同的是, 他是掛在 linux 的 thread 來處理


3. queue_work

排程


work queue 與 work struct 關係





3. current
宣告在 <linux/sched.h> , 可以得到目前的名稱與 pid
printk("The process is \"%s\" (pid %i)\n",
  current->comm, current->pid);
4. work queue
如果沒有自訂 work queue  的話, 他會在 default 安排的 "events" thread

create_singlethread_workqueue


create_workqueue 是 per-CPU 都有一個 cwq

==

github source



handler


module init



module exit



==
執行結果:

module init start : 4
module init ret=0
f2() on cpu 3, pname:kworker/3:1, pid(62)
f2() on cpu 3, pname:kworker/3:1, pid(62)
f3() on cpu 3, pname:kworker/3:2, pid(817)
....
module exit start
module exit success : 4

==

這樣有 thread , 我們就可以回到前面章節,
來測試 semaphore/spin_lock/...



留言

熱門文章