v3 2026-08-04

基于section的HugeTLB vmemmap优化 · v3

vmemmap 改为基于 section 的优化,初始化共享尾部页并让 HugeTLB 切换过去

原始补丁链接

子 Patch(17)

1/17
mm/sparse: relax struct mem_section size constraints
将 section 到 root 的查找由掩码改为取模,放宽 struct mem_section 大小必须为 2 的幂的限制,仅保持双字对齐,便于以后扩展字段。
2/17
mm/sparse-vmemmap: rename HVO order macros
将 VMEMMAP_TAIL_MIN_ORDER/NR_VMEMMAP_TAILS 更名为 VMEMMAP_OPTIMIZATION_*,使宏名表达 HVO 优化需求而非 tail 缓存细节,无功能变化。
3/17
mm/mm_init: skip initializing shared vmemmap tail pages
让 memmap_init_range() 跳过 HVO 共享 tail vmemmap 页的初始化,避免覆写共享页内容;暴露 pfn_to_section_order() 辅助判断,循环后再初始化 migratetype。
4/17
mm/sparse-vmemmap: initialize shared tail vmemmap pages on allocation
在 vmemmap_get_tail() 分配共享 tail vmemmap 页时立即用 init_compound_tail() 初始化,不再依赖 memmap_init_range() 后续覆写或 HugeTLB 延迟处理。
5/17
mm/sparse-vmemmap: support section-based vmemmap accounting
扩展 section_nr_vmemmap_pages(),使基于 section 的 HVO 优化 section 能按存储的 compound order 与保留 vmemmap 页数正确计算页数。
6/17
mm/mm_init: factor out pfn_to_zone()
将 pfn_to_zone() 从 hugetlb_vmemmap.c 移到 mm/mm_init.c 并声明于 mm/mm_init.h,供 __init_deferred_page() 和 HugeTLB 早期 vmemmap 初始化复用。
7/17
mm/sparse-vmemmap: move vmemmap_get_tail() before PTE population
将 vmemmap_get_tail() 及其依赖的 vmemmap_alloc_block_zero() 移到 PTE population 之前,避免后续调用需要前向声明,无功能变化。
8/17
mm/sparse-vmemmap: support section-based vmemmap optimization
让 sparse-vmemmap 填充路径根据 section 中的 compound order 直接分配或复用共享 tail vmemmap 页,集中 HVO 逻辑,摆脱 HugeTLB 专用处理。
9/17
mm/sparse: initialize memory sections earlier
将 sparsemem section 元数据初始化提前到 mm_core_init_early(),在 HugeTLB bootmem 分配前完成,helper 改名为 sparse_sections_init()。
10/17
mm/hugetlb: switch HugeTLB to section-based vmemmap optimization
HugeTLB 改用 section-based vmemmap 优化:bootmem 大页只设置 section order,由通用 sparse-vmemmap 路径分配共享 tail 页,删除专用早期预填充 helper。
11/17
mm/sparse-vmemmap: remove SPARSEMEM_VMEMMAP_PREINIT support
移除 SPARSEMEM_VMEMMAP_PREINIT Kconfig、section 标志及空钩子;HugeTLB 已走通用 section-based 路径,present section 统一正常 sparse 初始化。
12/17
mm/sparse: inline usemap allocation into sparse_init_nid()
删除 PREINIT 后不再需要稀疏 usemap 的 transient 状态,将 usemap 分配内联到 sparse_init_nid(),去掉 sparse_usage_init/fini 和 sparse_init_early_section()。
13/17
mm/sparse: remove section_map_size()
删除 section_map_size(),其仅剩 !SPARSEMEM_VMEMMAP 路径在 __populate_section_memmap() 内联计算 PAGE_ALIGN(sizeof(struct page)*PAGES_PER_SECTION)。
14/17
mm/hugetlb: remove HUGE_BOOTMEM_HVO
删除 HUGE_BOOTMEM_HVO 标志和 helper;bootmem 大页是否已优化由 section order 直接判断,标记 folio 时使用 section 状态。
15/17
mm/hugetlb: remove HUGE_BOOTMEM_CMA
删除 HUGE_BOOTMEM_CMA 标志,早期 CMA 大页改由 hstate 跟踪,避免在 struct huge_bootmem_page 中存冗余标志。
16/17
mm/hugetlb: localize struct huge_bootmem_page
将 hugetlb_vmemmap_optimize_bootmem_page() 改为接收 pfn 和 order,不再依赖 struct huge_bootmem_page,从而把该结构移到 mm/hugetlb.c 局部定义。
17/17
mm/hugetlb: localize HUGE_BOOTMEM_ZONES_VALID
将 HUGE_BOOTMEM_ZONES_VALID 从公共 hugetlb 头文件移到 mm/hugetlb.c,仅供 huge_bootmem_page 标志处理使用,无功能变化。