皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

Linux 6.9 对工作队列进行了侵入式的重大修改

Linux 6.9 对工作队列进行了侵入式的重大修改

工作队列通常用于 Linux 内核的异步进程执行环境。在 Linux 6.9 中,工作队列(WQ)代码发生了 “重大的、侵入性的 “变化。

Tejun Heo 在 Linux 6.9 合并窗口开始时提交了所有的工作队列改动,他将其描述为:”在 Linux 6.9 合并窗口开始时提交了所有的工作队列改动:
在这个周期中,工作队列发生了大量改动,其中包括一些重大的侵入性改动。

– 在 6.6 版周期中,对非绑定工作队列进行了更新,使其更了解拓扑结构,更具灵活性,从而改善了工作队列在现代多 L3 CPU 上的表现。在此过程中,636b927eba5b(”workqueue: Make unbound workqueues to use per-cpu pool_workqueues”)将非绑定工作队列切换为使用按 CPU 前端的 pool_workqueues,作为提高前后映射灵活性的一部分。
这一改动带来的一个不受欢迎的副作用是,它使得按 CPU 计算的最大并发执行次数超过了允许的最大并发执行次数。我错误地认为这不会造成实际问题,因为大多数未绑定工作队列的用户都能自我调节最大并发数;然而,肯定有一些用户无法自我调节最大并发数(例如在 IO 路径上),允许的最大并发数急剧增加导致某些用例的性能明显下降。

为了解决这个问题,现在将最大并发执行分离到一个单独的结构 – wq_node_nr_active,这使得 @max_active 始终意味着系统范围内的最大并发,而与 CPU 或(最终)NUMA 节点的数量无关。这是一个相当具有侵入性的方法,在某些地方还有点笨拙;不过,笨拙的原因是,在某些现代机器上,处理执行局部性域和最大并发执行域之间的分歧是一个固有的要求。参见 5797b1c18919(”workqueue:为非绑定工作队列实施全系统范围的 nr_active 强制”)了解更多详情。

– 新增 BH 工作队列支持。它们类似于每 CPU 工作队列,但在 softirq 上下文中执行工作项。它有望取代 tasklet。不过,目前它还缺少禁用和启用工作项的功能,而这正是转换许多 tasklet 用户所需要的。为了避免合并窗口过于拥挤,我们将在下一个合并窗口中加入这项功能。对于目前尚未完成的几个转换补丁,我们将发送单独的拉取请求。

– Waiman 堵塞了工作队列 CPU 隔离中一个长期存在的漏洞,即有序工作队列不跟随 wq_unbound_cpumask 更新。有序工作队列现在遵循与其他未绑定工作队列相同的规则。
– 更多 CPU 隔离改进:Juri 修复了工作队列隔离中的另一个缺陷,即未绑定的救援程序不遵守 wq_unbound_cpumask。Leonardo 修复了延迟工作计时器在隔离 CPU 上失效的问题。

– 其他杂项变更。

更多细节请参见工作队列拉取请求。

希望任何影响都将是微乎其微的,在代码合并后的两周时间里,Linux 6.9 Git 目前似乎一切顺利。Linux 6.9 合并窗口将于明天随着 Linux 6.9-rc1 的发布而关闭。

转自 Linux 6.9 Sees Invasive & Significant Changes To Workqueues – Phoronix