|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
研究 linux 内核 - work queue
* f2 M* L+ i8 D" Y% Q" N2 L3 ?! q9 z( S- t9 a! [2 N
" L7 z! ?0 `( e% J5 K
) Z+ K5 G: s2 v$ f
4 i/ o; N" x8 \) N- c
1,work queue 与软中断和tasklet的关系! Y; {# c+ h4 d% i* w- _
7 P$ k+ b2 ~% g# U- R, y8 b
1 J& L. O. s% i, O- n5 ?1》work queue是内核线程来执行的,软中断和tasklet是qsoftirqd内核线程来执行的。! O7 |4 F4 H* J
2》work queue能休眠,软中断和tasklet不能。
: X. u0 J. o0 V% f( D1 p, [
; X% E! ^6 ^" y# k B( n4 K1 s
0 D- ]/ |# p% k, D: T1 d
/ [0 o4 p8 o, U- Z2 W$ y
" {7 H& ~$ a* z. P2,work queue工作原理和过程
u0 U5 L% w! V- F. I% V# f3 _1 k
3 S! g8 |" |0 K! E( f f! b- P, q1 {! \0 K
1》内核有一个默认的工作者线程(worker thread),event(n),n代表CPU。
# d# z. m s) V- [$ P8 Y2》每个工作者线程有一个工作结构体链表。! W9 r0 @6 c2 |8 ^7 Z
3》链表的节点结构体成员有个函数指针,和函数参数。来执行下半部任务。
: p+ u" X( w' t0 ^4》工作者线程检查这个链表,发现有节点,就执行这个节点的函数指针。
) ]: O0 y# L7 g; t1 Z) x5》执行完毕后,将这个节点移除链表。% R- t- d7 C; d! {# P
6》如果链表为空,工作者线程休眠。
3 ^2 F# E4 O& a0 P# z' q/ x0 M: L$ U; }( D5 R/ K8 ^) a1 i! F
* E+ z: {9 U5 x( @! J2 p
- C+ i% L& e u% {
# G' s3 m, S3 I5 B3,如何在驱动中使用work queue
; ~7 u% U3 ]% l( r7 U- s6 t) p9 G8 v% m* x5 G0 F. @5 P( `
1 u% v/ A6 O6 |1》一般使用内核默认的工作者线程(evnet),也可以自己创建一个(rill):
5 A: M; k1 Q: \: Lstruct workqueue_struct *rill_wq;
/ \! s% T- Z- n- jrill_wq = creat_workqueue("rill");; W" G9 N$ P0 _; h8 m
2 {# x" ]. F9 X. y6 w
. j/ R. m' Z, T' I& g- [/ P# I2》创建工作结构体(链表的一个节点)* ]* Y4 i6 k. H# W7 D6 Y$ d$ F Y
静态:8 b6 j. h, V8 y* T7 K% G5 e+ _
DECLARE_WORK(name,void(*func)(void*),void*data);& c1 k5 o& c0 V: _3 Z/ Q
+ B, f( `; `* G: a' s0 P
1 D& K+ `1 ~# @; g& v- Q7 p) J% g: v动态:
' \- h" U9 N, V/ s1 y0 u) A1 W0 {INIT_WORK(struct work_struct *work,void(*func)(void*),void*data);
) ?5 o/ a1 e7 M
! O* r0 `" s4 [' M6 u' c. h" N) T
7 x9 I. A8 k) f' A+ I3》实现处理函数
8 i* S- l( `9 E8 @- [; }在驱动里实现func函数。
# Y2 i6 B H I3 Q+ h
4 H) l. Z4 K5 U( a. Y& t' C% v/ K
/ W) L/ H8 M8 d' g$ C4》调度工作队列
% m- }$ A3 j. c2 U7 i. \schedule_work(&rill_wq);
! j; [: L2 _2 p+ I1 r* i7 O: K4 h! `: q
7 B/ \/ X2 N/ M! F8 H! Q2 z' i9 c& u
5》刷新
$ W. z. I. A7 u+ r7 Lflush_workqueue(&rill_wq);
) }6 e4 G5 g% q. E5 N1 k; K% W8 F, d; P
* a2 ]1 M- f: d+ e" U# L# `5 a& T" \& I8 u
. Z5 {8 D. l3 N' |
6 u; b! Y1 b( y! b; f6 X/ E$ @5 \/ w _, N
( d% |6 i3 G, H# p; H1 z g
8 W7 u; T! t. K t8 r
: U; t% Z* `4 d! z. S# y& p
7 y6 e0 Q$ I! E5 {7 i( I `* O. | P
H e4 j+ b$ N1 H- t
|
|