linux workqueue
前言
- 先知整个流程:如何创建一个workqueue、一个work queue入一个workqueue之后,work对应的func怎么被执行;
- 再扣细节:__alloc_workqueue_key中WQ_UNBOUND flag有什么作用?max_active的作用是什么?worker的动态管理?
数据结构关系图
初始化
初始化有两部分:
部分1
部分2
工作队列的创建
work执行
动态管理
动态创建
maybe_create_worker
动态销毁
unbound作用
也就是这个pwq一个来自于percpu,一个是node;具体原因还不是特别懂;
不过可以看出这个unbound还是bound是workqueue创建时候设置的,__queue_work
的区分来源于工作队列的创建;
没有理解很到位,求大佬指教
max_active的作用
在我们的驱动中,通常会有执行顺序的要求。
比如编解码,要求前一帧编码或解码完成之后,该帧才能正常编解码;
如果我通过work来完成编解码的处理:虽然work是以先后顺序加入wq对应的pwq对应的pool_worker的链表,但是实际worker执行的时候可能由于调度原因,导致先加入的work对应的function后执行了,那么整个执行流程就会有问题了,怎么解决这个问题呢?
设置max_active=1即可解决;有已经封装好的接口:alloc_ordered_workqueue
;
解决原理
在__queue_work
函数中,如果超过设置的max_active,那么就会加入delayed_works链表,而不是worklist链表了;
process_one_work
执行完worklist的function之后,调用到pwq_dec_nr_in_flight
,会去判断pwq->delayed_works
是否为空,
若不为空,调用pwq_activate_first_delayed
把该work从delayed_work链表移至worklist链表,等待worker执行;