KVM“电锯”将随 Linux 7.3 落地:拆解 God 数据结构
在虚拟化领域,很少有补丁集的命名如此直白。Red Hat 工程师兼 KVM 维护者 Paolo Bonzini 近期将名为 kvm-chainsaw(KVM 电锯)的分支合并进了 KVM 的 next 树。据 Phoronix 7 月 26 日的报道,这一重大清理工作极大概率将随着即将开启的 Linux 7.3 合并窗口正式进入内核主线。
所谓“电锯”,旨在裁切长期处于超载状态的 kvm_mmu——Paolo 本人直白地将其称为 god data structure(把所有逻辑都往里塞的“神级/上帝结构体”)。
一个结构体承担了三项职责
在原有的架构中,kvm_mmu 强行绑定了三项本应解耦的职责:
- 3. 构建影子页表(Shadow Page Table)。
这导致名为 nested_mmu 的组件虽然仅使用到了其中一少部分(它并不负责构建页表),却不得不常驻全套字段。历史命名遗留问题更是雪上加霜:由于 nested_mmu 的出现早于 guest_mmu,占据了更直观的名称,导致代码注释中写着“Exempt nested MMUs”(豁免嵌套 MMU),而代码逻辑实际豁免的却是 guest_mmu。对于初接触该代码的开发者而言,单凭命名就极易产生混淆。
此外,部分逻辑在客户机页表与宿主机页表之间存在复用(例如保留位检测),而另一些逻辑则各自独立实现(例如将 permission_fault 替换为 is_executable_pte() 等简化路径)。由于职责相互纠缠,导致代码复用的边界极其模糊。
“电锯”如何进行拆解
该补丁集将庞大的 kvm_mmu 拆分为了三个职责明确的新模块:
- •
kvm_pagewalk:专职的页表遍历器。每个 vCPU 配备两个实例:gva_walk 与 ngpa_walk。无论运行 L1 还是 L2 虚拟机,walk_mmu 均固定指向单一的 gva_walk,不再需要在 root_mmu 与 nested_mmu 之间频繁切换。 - •
kvm_mmu:仅保留“构建页表”这一核心职责。在构建影子页表时调用遍历器:root_mmu 走 gva_walk,guest_mmu 则走 ngpa_walk。 - •
kvm_page_format:使 KVM 能够操作已存在的 PTE,并将 permission_mask() 的相关代码与原有的 rsvd_bits_validate 进行了整合。kvm_pagewalk 和 kvm_mmu 各自持有一份 format,分别对应原 kvm_mmu 中 gPTE 和 SPTE 的两套保留位校验逻辑。
合并说明中的表述十分克制:重构清理本身就已经极具价值——至少大幅降低了 guest_mmu 与 nested_mmu 概念上的混淆。接下来已有提案建议对 guest_mmu 进行重命名,不过 RFC 阶段社区意见尚未统一。
重构之后,拓展新功能
最后的关键补丁不仅停留在代码美学层面。在将 permission_fault() 机制改造为可针对 SPTE 对照 struct kvm_page_fault 进行检查后,KVM 具备了支持 XS≠XU 特性 SPTE 的潜在能力——此前受限于架构无法实现,现在则可以通过内存属性(memory attributes)路径顺利引入。
这是典型的内核大重构逻辑:先用“电锯”将上帝对象切开,职责边界清晰后,新的拓展语义才有空间挂载。本次合并 commit 参见:
[https://git.kernel.org/pub/scm/virt/kvm/kvm.git/commit/?id=a204badd8432f93b7e862e7dac6db0fe3d65f370](https://git.kernel.org/pub/scm/virt/kvm/kvm.git/commit/?id=a204badd8432f93b7e862e7dac6db0fe3d65f370)
时间线与展望
目前 Linux 7.2 仍处于 rc 阶段(截至报道当日为 7.2-rc5)。Linux 7.3 的合并窗口预计将于 8 月下半月开启。kvm-chainsaw 已进入 KVM next 分支,按照维护者的推进节奏,合入 7.3 是合理的目标;但最终能否原样进入主线,仍取决于 Linus Torvalds 的拉取(Pull)决定。
对于云厂商及深度使用嵌套虚拟化的用户而言,这虽然不是“开机性能立刻提升 20%”式的营销新闻,但却是后续页表优化、权限位控制以及 memory attributes 等特性得以实现的基础。虽然名为“电锯”,执行的却是精准的雕琢:先把破损的榫卯结构拆解干净,才能在此基础上加装全新的抽屉。
信息来源:
- • https://www.phoronix.com/news/KVM-Chainsaw-Linux-7.3
- • https://git.kernel.org/pub/scm/virt/kvm/kvm.git/commit/?id=a204badd8432f93b7e862e7dac6db0fe3d65f370