在周日发布的 Linux 6.18-rc5 内核版本之前合并的是对 IBM POWER 硬件上观察到的性能回归的部分修复。
自从在 Linux 6.17 周期中从内核的 FUTEX 代码中删除了“IMMUTABLE”标志以来,IBM 工程师们已经注意到性能回归主要影响了他们的硬件。现在在 Linux 6.18-rc5 中,这种性能回归至少减少了一半。

英特尔工程师 Peter Zijlstra 通过优化 Futex 代码中的每个 CPU 引用计数找到了部分修复/解决方案。Zijlstra 在合并的补丁中解释说:
“Shrikanth 指出,每个 CPU 的引用计数器仍然比旧的不可变选项(完全移除引用计数)慢大约 10%。
通过以下方式进一步优化每个 CPU 的引用计数器:
– 从 RCU 切换到抢占式调度;
– 使用__this_cpu_*(),因为我们现在禁用了抢占式调度;
– 从 smp_load_acquire()切换到 READ_ONCE()。这全部都是安全的,因为禁用抢占式调度会阻止 RCU 宽限期,就像 rcu_read_lock()一样。
禁用抢占允许使用 __this_cpu_*(),前提是变量只存在于任务上下文中——这里就是这种情况。
此外,既然我们知道将 fph->state 更改为 FR_ATOMIC 需要完整的 RCU 宽限期,我们可以依赖其中的隐含 smp_mb() 来替换 acquire barrier()。
这与 percpu_down_read_internal() 的快速路径非常相似。
这对于 PowerPC 来说很重要,因为它使用的是通用的 this_cpu_*() 实现,该实现依赖于 local_irq_disable()(x86 实现依赖于它是一个单一的 memop 指令以实现中断安全)。切换到 preempt_disable() 和 __this_cpu*() 避免了这种中断状态切换。此外,PowerPC 需要 LWSYNC 来实现 ACQUIRE 障碍,不需要使用显式障碍可以节省很多。
合并后,性能差距减少了一半,降至大约 5%。”
今天,这一改进被合并到 Linux 6.18 Git 代码中,作为本周锁定/紧急拉取请求的唯一更改。
转自 Linux 6.18-rc5 To Cut Down Performance Regression Observed On IBM POWER CPUs – Phoronix
Linuxeden开源社区