v2
2026-07-20
基于section的HugeTLB vmemmap优化 · v2
将HugeTLB的vmemmap优化切换到通用sparse-vmemmap的section感知路径,替代原有的早期启动预填充方案。
原始补丁链接
子 Patch(17)
1/17
mm/sparse: relax struct mem_section size constraints
放宽 struct mem_section 的 2 次幂大小约束,改用模运算查找,同时保持双字对齐以支持未来字段添加而不破坏布局。
2/17
mm/sparse-vmemmap: rename HVO order macros
将 HVO 相关的 VMEMMAP_TAIL_MIN_ORDER 和 NR_VMEMMAP_TAILS 宏重命名为 VMEMMAP_OPTIMIZATION 前缀,使名称描述优化需求而非实现细节。
3/17
mm/mm_init: skip initializing shared vmemmap tail pages
在 memmap_init_range() 中跳过共享 vmemmap tail 页的初始化,通过 HVO 元数据检测并跳过,避免覆盖共享页内容,减少冗余初始化。
4/17
mm/sparse-vmemmap: initialize shared tail vmemmap pages on allocation
在 vmemmap_get_tail() 中立即初始化共享 tail vmemmap 页,使用 init_compound_tail(),不再依赖 HugeTLB 等用户的延迟处理。
5/17
mm/sparse-vmemmap: support section-based vmemmap accounting
让 section_nr_vmemmap_pages() 识别基于 section 的优化 section,从 section order 和 HVO 保留页数计算 vmemmap 页数。
6/17
mm/mm_init: factor out pfn_to_zone()
[Re: [PATCH v2 06/17] mm/mm_init: factor out pfn_to_zone()] > On Jul 20, 2026, at 17:31, Muchun Song songmuchun@bytedance.com wrote: > > pfn_to_zone() in hugetlb_vmemmap.c duplicates the zone looku
7/17
mm/sparse-vmemmap: move vmemmap_get_tail() before PTE population
将 vmemmap_get_tail() 及其依赖的 vmemmap_alloc_block_zero() 移到 PTE 填充之前,避免后续添加前向声明。
8/17
mm/sparse-vmemmap: support section-based vmemmap optimization
On Jul 20, 2026, at 17:31, Muchun Song songmuchun@bytedance.com wrote: > > Teach sparse-vmemmap population code to use the compound page order > when deciding whether a vmemmap page can be optimi
9/17
mm/sparse: initialize memory sections earlier
将 sparsemem section 元数据初始化移到 mm_core_init_early() 中,早于 free_area_init() 和 HugeTLB bootmem 设置,重命名为 sparse_sections_init()。
10/17
mm/hugetlb: switch HugeTLB to section-based vmemmap optimization
将 HugeTLB 切换到基于 section 的 vmemmap 优化,通过设置 section order 让通用 sparse-vmemmap 路径处理共享 tail 页,移除专用早期设置代码。
11/17
mm/sparse-vmemmap: remove SPARSEMEM_VMEMMAP_PREINIT support
移除 SPARSEMEM_VMEMMAP_PREINIT 支持,因为 HugeTLB 已改用通用 section-based 路径,删除相关 Kconfig、section 标志和空 early hook。
12/17
mm/sparse: inline usemap allocation into sparse_init_nid()
在 sparse_init_nid() 中内联 usemap 分配,移除 transient sparse_usagebuf 状态和 helper 包装,简化 sparse 初始化流程。
13/17
mm/sparse: remove section_map_size()
移除 section_map_size(),将其唯一调用点 __populate_section_memmap() 中 !CONFIG_SPARSEMEM_VMEMMAP 路径的大小计算内联为 PAGE_ALIGN(sizeof(struct page) * PAGES_PER_SECTION)。
14/17
mm/hugetlb: remove HUGE_BOOTMEM_HVO
删除 HUGE_BOOTMEM_HVO 标志,因 HugeTLB 改用 section-based vmemmap 优化后,该状态已由 section order 反映,直接通过 section 状态判断是否标记 folio 为 vmemmap-optimized。
15/17
mm/hugetlb: remove HUGE_BOOTMEM_CMA
移除 HUGE_BOOTMEM_CMA 标志,改为从 hstate 跟踪早期 CMA hugetlb 页面,消除冗余的 bootmem 标志,精简元数据。
16/17
mm/hugetlb: localize struct huge_bootmem_page
将 struct huge_bootmem_page 从 mm/internal.h 移至 mm/hugetlb.c,并修改 hugetlb_vmemmap_optimize_bootmem_page() 接口为仅接收 PFN 和 order,减少内部类型暴露。
17/17
mm/hugetlb: localize HUGE_BOOTMEM_ZONES_VALID
将 HUGE_BOOTMEM_ZONES_VALID 定义从公共头文件移入 mm/hugetlb.c,紧邻其唯一使用者 huge_bootmem_page 结构,无功能变化。