WQ_DRAINING
此标志用于指示内核当前正在刷新工作队列,并且新的工作项不能在其上排队。在此阶段仅允许当前待处理或正在运行的工作项,直到整个工作队列完全为空。
有关详细信息,请查看drain_workqueue()
in的实现kernel/workqueue.c
。
WQ_RESCUER
此补丁已在最新内核中弃用此标志,并且行为现在由该WQ_MEM_RECLAIM
标志确定。
就“救援”功能而言,这里是文档的相关部分kernel/workqueue.c
,
工作队列救援线程函数。每个设置了 WQ_MEM_RECLAIM 的工作队列都有一个救援者。
池上的常规工作处理可能会阻止尝试创建使用 GFP_KERNEL 分配的新工作人员,如果当前在同一队列上的某些工作需要处理以满足 GFP_KERNEL 分配,则该工作人员极有可能发展成死锁。这是救援人员解决的问题。
当这种情况可能发生时,池会召集所有在池中排队的工作队列的救援人员,让他们处理这些工作,以保证前进的进度。
WQ_MAX_UNBOUND_PER_CPU
(与您的解释相反,WQ_MAX_UNBOUND_PER_CPU不是 cpu 的数量。它是可以与 cpu 关联的工作队列的数量。)
工作队列传统上是按 cpu 的,即每个工作队列都与特定的 cpu 相关联,由于缓存局部性而导致更好的性能。内核调度程序别无选择,只能将其始终调度在定义它的 cpu 上。在当前架构上,这会导致功耗增加,因为即使是单个工作队列也可以防止 CPU 空闲和关闭。因此引入了未绑定的工作队列。调度器可以自由地重新调度它认为合适的任何 cpu 上的未绑定工作队列。
此类工作队列的总数受限于WQ_UNBOUND_MAX_ACTIVE
定义为num_possible_cpus() * WQ_MAX_UNBOUND_PER_CPU
(不超过由 确定的系统中的总工作队列的限制WQ_MAX_ACTIVE
)。