workqueue分析

来源:互联网 发布:南京溧水网络问政 编辑:程序博客网 时间:2024/05/21 17:18

__queue_work函数

1、确保调用时禁止中断;

2、选择pwq,如果指定了CPU,则选择wq->cpu_pwqs;否则选择wq->numa_pwq_tbl[node];如果该work_struct上次执行过,则选择上次执行的pwq;

3、当前工作着色区需处理的工作数量pwq->nr_in_flight++;

4、如果pwq待执行的工作数量没有达到pwq->max_active,则把新工作排列到pwq->pool->worklist;否则排列到pwq->delayed_works;


worker_thread函数

1、当被唤醒后,脱离idle状态和队列;

2、如果POOL中已经有足够的worker在处理工作,则再次进入idle睡眠状态;

3、如果没有多余的idle备用,则调用manage_workers创建更多的worker;

4、依次处理pwq->pool->worklist和worker->scheduled上等待的工作,直到工作处理完成或者POOL中允许的worker多余1个;

5、如果需要再次管理worker,则调用manage_workers(worker);

6、该worker再次进入IDLE状态,等待再次被唤醒;


pwq->delayed_works上面的工作被提交到pwq->pool->worklist出现在两个地方:pwq_adjust_max_active和pwq_dec_nr_in_flight


atomic_dec_and_test函数:先返回数据,再自减

flush_workqueue_prep_pwqs函数:指定wq下面的每个pwq的work_color和flush_color

0 0
原创粉丝点击