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执行;

posted @ 2023-10-10 14:42  _xingxing  阅读(7)  评论(0编辑  收藏  举报