这是最好的开源,NVIDIA Linux 内核工程师最终修复了在早期 Linux 6.15 内核代码上运行时 AMD 集成显卡和独立显卡出现的性能回归。
今天早上发出来拉入 Linux 6.15 Git 树的是这个 x86 修复程序拉取请求。此拉取请求的标题是:
“修复了 AMD iGPU 和 dGPU 驱动程序上的性能回归,该问题与意外激活 DMA 弹跳缓冲区有关,如果 KASLR 干扰得足够多,该缓冲区会导致游戏性能下降。”
在深入研究这一变化时,更有趣的是,NVIDIA 工程师对 AMD iGPU/dGPU 驱动程序性能回归进行了回归修复。但这并非没有原因,或者只是出于他的善良……事实证明,最终这种回归是工程师无意中引入的。作为一名优秀的开源开发人员,他不是简单地放弃或等待其他人修复它,而是为引入的回归修复自己的代码,即使它只是回归竞争对手的驱动程序。
上周,作为 Linux 6.15 的所有 Intel/AMD x86_64 更新的一部分,合并了对内核地址空间布局随机化 (KASLR) 的更改。大多数 x86/x86_64 系统的 KASLR 熵正在降低,以支持超过 10 TiB 区域的 PCI BAR 空间。NVIDIA 工程师 Balbir Singh 做出了这一改变,并最终导致 AMD 驱动程序倒退。
回归在包含回归修复的提交中进行了解释:
“正如 Bert Karwatzki 报道的那样,以下最近的提交会导致 AMD iGPU 和 dGPU 系统的性能回归:
7ffb791423c7(”x86/kaslr:减少大多数 x86 系统上的 KASLR 熵“)
它暴露了 nokaslr 和区域设备交互的错误。
该错误的根本原因是 GPU 驱动程序注册了一个区域设备专用内存区域。禁用 KASLR 或应用上述提交时,direct_map_physmem_end设置为远高于 10 TiB(通常为 64TiB 地址)。当通过 add_pages() 将区域设备专用内存添加到系统时,它会将 max_pfn 提高到相同的值。这会导致 dma_addressing_limited() 返回 true,因为设备无法一直寻址内存,直到 max_pfn。
这导致在 iGPU 上玩的游戏出现回归,因为它导致 DMA32 区域用于 GPU 分配。
通过在 x86 系统上不增加 pgmap 时add_pages() 上增加 max_pfn 来解决此问题。pgmap 的存在用于确定是否通过 add_pages() 添加设备私有内存。
Bert Karwatzki 在将近一个月前报告了这种回归,当时代码仍在 linux-next 测试区域内。他将这个问题一分为二,并报告了至少一个 Steam 游戏的故障:
“使用 linux next-20250307 通过 Steam 玩游戏 stellaris,我注意到加载游戏变得缓慢,进度条卡在 100%。在这种情况下,鼠标和键盘输入不再正常工作。切换到 VT 并杀死 stellaris 在一定程度上解决了这种情况,尽管在某种情况下,触摸板在那之后就不工作了。我在 v6.14-rc5 和 next-20250307 之间将其一分为二,并将其作为第一个错误提交。
现在,一旦拉取到达,此 AMD 图形驱动程序性能回归将在最新的 Linux 6.15 Git 代码中修复,这应该会在今天晚些时候修复。感谢所有参与其中的人,他们在周日 Linux 6.15-rc1 版本发布之前这么快就解决了这个问题。
另外,x86 修复拉取请求还有另一个性能回归修复。对于非 FSRM/EMRS CPU,待处理代码现在将写入与 copy_user_generic() 内的 8 字节对齐。这是针对没有 FSRM/EMR 的 CPU 的两年前的性能回归。
转自 NVIDIA Engineer Fixes Early Linux 6.15 Performance Regression Affecting AMD GPU Drivers – Phoronix