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
如果沒有自訂 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/...
繼續先 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/...
留言
張貼留言