v2 2026-10-03

arm64 HVO 支持 · v2

hugetlb vmemmap 优化 v2:修复HVO恢复失败、TLB刷新及架构动态禁用等问题。

原始补丁链接

子 Patch(20)

1/20
hugetlb: Don't restore vmemmap of non-HVOed folios on bulk restore error
批量恢复失败时 folio_list 可能含未 HVO 页,对其 restore 会触发 __hugetlb_vmemmap_restore_folio() 的 !folio_test_hugetlb 警告;跳过未优化页直接释放。
2/20
arm64/pgtable: Clear AF with LDCLR on supported systems
arm64 清 PTE AF 时用 atomic64_fetch_andnot_relaxed 替代 cmpxchg 循环,LSE 下生成 LDCLR;避免新架构对 cmpxchg 前向进度保证放宽导致的活性问题。
3/20
hugetlb_vmemmap: Always flush TLB if needed upon PTE remapping
vmemmap_remap_range() 部分优化返回时可能漏 TLB flush;改为只要调用者请求就 flush,防止陈旧 vmemmap 映射,后续再完善部分优化处理。
4/20
hugetlb_vmemmap: Leave pages partially HVOed upon restore failure
vmemmap_remap_free() 恢复失败时不再假定回滚必成功,保留 HVO 标志并释放多余 vmemmap 页;把 vmemmap_tail 传入 restore,避免部分 HVO 页泄漏。
5/20
hugetlb_vmemmap: Use try_update_vmemmap_pte to update in-use PTEs
arm64 不能安全用 set_pte_at() 替换 in-use vmemmap PTE;新增 try_update_vmemmap_pte() 并用于 HVO,保证更新无缺页窗口,page_table_check 对 init_mm 为空操作。
6/20
hugetlb_vmemmap: Allow architectures to dynamically disallow HVO
新增 arch_supports_hugetlb_vmemmap_optimization() 钩子,让 arm64 等按运行特性动态禁止 HVO;早期不支持的 bootmem 大页延后到 prep_and_add_bootmem_folios() 优化。
7/20
hugetlb_vmemmap: Disable HVO sysctl if arch doesn't support HVO
当 arch_hugetlb_vmemmap_optimization_supported() 为假时,hugetlb_vmemmap_init() 不创建 vm.hugetlb_optimize_vmemmap sysctl,避免无 HVO 硬件的 arm64 用户误启用。
8/20
hugetlb: Fully initialize tail struct pages of non-pre-HVOed bootmem folios
非 pre-HVO 的 bootmem folio 只初始化了部分 tail struct page;若 arm64 HVO 能力晚到,普通 remap 会用未初始化 tail 触发 vmemmap_remap_pte() 的 PageTail 警告,故提前初始化全部 tail。
9/20
hugetlb_vmemmap: Allow architectures to make HVO enablement boot-time only
arm64 需启动时确定 HVO,否则后续 online 无 HW AF 的 CPU 不安全;新增 CONFIG_ARCH_WANT_HUGETLB_VMEMMAP_RO_AFTER_INIT,使 vmemmap_optimize_enabled 为 __ro_after_init 且 sysctl 只读。
10/20
hugetlb_vmemmap: Expose whether HVO is enabled to architecture code
新增 hugetlb_vmemmap_optimize_enabled() 并在 asm/hugetlb.h 前声明,让 arm64 等按 hugetlb_free_vmemmap 是否启用决定启动配置;它不表示架构是否支持 HVO。
11/20
arm64: Add bbm_through_af capability
arm64 新增 bbm_through_af 系统能力,要求所有 CPU 支持 BBML3 和硬件 AF,以安全完成 vmemmap 的 block->table 及 !AF 过渡;结合 HVO 支持避免 late CPU 无法上线。
12/20
arm64: Implement try_update_vmemmap_pte using the AF trick
arm64 用 AF trick 实现 try_update_vmemmap_pte():先清 AF 确保旧翻译不会被缓存,再原地替换 PTE,避免 BBM 造成缺页窗口;依赖 system_supports_bbm_through_af()。
13/20
arm64: Support hugetlb vmemmap optimization
arm64 在检测到硬件 AF 与 BBML3 时通过 arch 钩子支持 HVO;缺少特性时 sysctl 不出现,命令行和默认开启均不生效。
14/20
hugetlb_vmemmap: Add fault injection for in-place vmemmap PTE updates
为 try_update_vmemmap_pte() 失败路径添加 fail_hugetlb_vmemmap_pte 故障注入,注入时返回 -EAGAIN 且不改页表;支持 debugfs 和启动参数,用于覆盖 HVO 回滚与部分优化。
15/20
selftests/mm: Add HugeTLB vmemmap optimization stress test
新增 HVO 压测脚本,反复调整 hugetlb pool 优化/恢复,并发读 kpageflags/kpagecount、compact 和内存热插拔,并用 PTE 故障注入覆盖回滚路径,校验 vmemmap 计费与日志。
16/20
hugetlb_vmemmap: Use try_populate_vmemmap_pmd for replacing in-use PMDs
为替换 in-use vmemmap 叶 PMD 引入可失败的 try_populate_vmemmap_pmd(),并把 split_page() 移到 PMD 更新后,在页表锁下保证安全;只支持叶 PMD 转非叶 PMD。
17/20
arm64: Implement try_populate_vmemmap_pmd using AF trick
arm64 用 AF trick 实现 try_populate_vmemmap_pmd(),在不覆盖非叶 PMD 时无需 HAFT 且 TLB 刷新不变;支持 BBML3 可绕过;该做法的 Arm ARM 依据存疑。
18/20
arm64: Drop BBML3 requirement for HVO
因 try_populate_vmemmap_pmd() 改用 AF trick 更新 PMD,arm64 不再要求 BBML3 即可启用 HVO,从而覆盖更多硬件平台。
19/20
hugetlb_vmemmap: Add fault injection for in-place vmemmap PMD splits
新增 fail_hugetlb_vmemmap_pmd 故障注入,使 try_populate_vmemmap_pmd() 的 PMD split 返回 -EAGAIN 且不改页表;用启动参数触发仅一次的 vmemmap PMD split 失败。
20/20
selftests/mm: Add HVO pmd-split fault injection tests
在 HVO 压测脚本中增加 PMD split 故障注入阶段;因 vmemmap PMD 只拆不折叠,必须在主压测前先运行,以覆盖 try_populate_vmemmap_pmd() 失败路径。