|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
研究 linux 内核 - work queue
X) i% S1 M9 ]; z. W& P9 Q; n6 q7 v# d4 P0 t. }
; j. _# E* w' x' U+ @! q
0 e' ?+ {, G9 i! m" P0 c! [0 [4 [' v" {; M
1,work queue 与软中断和tasklet的关系
4 e- h4 z ?: U' x* E- C
- B! ~; }5 x' h3 a# [0 P6 W# L8 k; J$ _* s% W) a
1》work queue是内核线程来执行的,软中断和tasklet是qsoftirqd内核线程来执行的。
2 s4 g* @+ }) \* A2》work queue能休眠,软中断和tasklet不能。: O" }/ Q3 k1 L% U4 k1 _ V
6 d3 p* R7 @ V4 ^8 j# H8 O$ r( ?
+ G& y- g0 ~- E A
$ p' M2 B# U L7 o3 H1 ]
2,work queue工作原理和过程
F. s! A9 n9 [! {5 l. G6 T" y. P6 m3 h& F. O$ {) d
y# o0 T% K: B A& S; J1》内核有一个默认的工作者线程(worker thread),event(n),n代表CPU。/ m8 c/ A+ @. o6 P
2》每个工作者线程有一个工作结构体链表。2 M f1 d9 Z- F) }- [/ \
3》链表的节点结构体成员有个函数指针,和函数参数。来执行下半部任务。' [ v7 J9 I2 P- {
4》工作者线程检查这个链表,发现有节点,就执行这个节点的函数指针。
4 ?( [( j8 P9 n2 w' o+ O- \( L5》执行完毕后,将这个节点移除链表。
9 V5 H. o- W6 p n; [/ ^6》如果链表为空,工作者线程休眠。9 p5 S6 R, d% B& s2 @3 P
5 ^& m4 a( C5 L/ B H$ w$ w% d$ l0 C( T
0 m9 @- k% }, q6 [* Z
" j& x, F0 `' |* K" k
3,如何在驱动中使用work queue
3 w) [# I3 X5 A. _+ J# S. X5 g9 @
0 _1 K% M. O) e3 G% T; B3 {: E. h ^- Q& D5 j: n5 k
1》一般使用内核默认的工作者线程(evnet),也可以自己创建一个(rill):
- {6 F: E# W- x sstruct workqueue_struct *rill_wq;
! s, [9 k0 b7 s; b$ s3 v! x' Yrill_wq = creat_workqueue("rill");
) o3 Q7 A5 m& q! o* l* L
5 u3 p3 p* ~, k* `8 i u' t7 h$ S
, m7 k! i9 {0 J/ }) |2》创建工作结构体(链表的一个节点)
; \: O' ^; j% i& H# l6 J6 H静态:4 I* i1 v) z- i; n# q1 |7 a
DECLARE_WORK(name,void(*func)(void*),void*data);. [, b; b6 M1 N" | y; c' v8 U, m
/ y; W& I7 z* [7 s9 V
' U: O5 T& y9 t3 b动态:
y5 F) M. a2 y2 o( N$ aINIT_WORK(struct work_struct *work,void(*func)(void*),void*data);
) d9 R) z( s3 `7 V( D2 Y* `
' E4 ?; G |4 _* U: k) U) H7 z8 ]
3》实现处理函数+ b$ @9 T. }( b: I2 S# k% ?0 x
在驱动里实现func函数。7 n# H2 A: J6 {" f1 x
3 R8 G/ u- X$ T# E! w/ d) Y( d/ \6 M& y$ d; e& D
4》调度工作队列
2 n5 }- U! v/ z+ f4 r4 v" b Uschedule_work(&rill_wq);
+ B) V4 x5 }4 }$ l# j6 [$ t o; _: C2 N1 H& [( _3 y
! a L1 _9 I2 ^- K C% P n5》刷新
6 R% W! X4 I; \flush_workqueue(&rill_wq);6 Q, D. v" I- _7 u. z& _
5 H c& P$ {+ e1 d3 ~6 u. F6 X6 r3 T
) v' [7 y# c U6 [4 x |6 f v1 Q" g4 N* x& [/ f
* w% N4 B6 @9 N1 K7 f1 A
$ j* k% {' A* \8 Q6 K- l% o# z6 m/ L- R3 n4 g6 W* Y4 ?/ e0 K! [" g7 n
$ ?$ L" t) @( ~ E
, | N; g q3 N* B- ]9 }+ B
' M' E1 u, K8 k! x: u9 s: ^9 L$ |: q! ^1 [# k
3 w& R& u" M% ]- Q! E
; `7 ^1 F, M, f5 A) i6 I |
|