v6 2026-09-10

基于section的HugeTLB vmemmap优化 · v6

Muchun Song v6 系列优化稀疏 vmemmap:放松 mem_section 约束、重命名 HVO 宏、按需初始化共享 tail 页并转换 HugeTLB。

原始补丁链接

子 Patch(17)

1/17
mm/sparse: relax struct mem_section size constraints
让 struct mem_section 不再强制 2 的幂大小,section-to-root 查找改用普通取模,保留双字对齐,便于后续添加字段而无需配置相关填充与布局检查。
2/17
mm/sparse-vmemmap: rename HVO order macros
将 VMEMMAP_TAIL_MIN_ORDER、NR_VMEMMAP_TAILS 重命名为 VMEMMAP_OPTIMIZATION 前缀,使宏描述 HVO 优化适用范围而非 tail-page 缓存实现细节,无功能变化。
3/17
mm/mm_init: skip initializing shared vmemmap tail pages
memmap_init_range() 跳过 HVO 共享 tail vmemmap 页,避免覆盖共享内容;用 pfn_to_section_compound_order() 从 section 元数据识别 tail 范围,pageblock migratetype 另行初始化。
4/17
mm/sparse-vmemmap: initialize shared tail vmemmap pages on allocation
既然 memmap_init_range() 已跳过共享 tail 页,vmemmap_get_tail() 在分配时直接调用 init_compound_tail() 初始化共享 tail vmemmap 页,不再依赖后续覆盖式初始化。
5/17
mm/sparse-vmemmap: support section-based vmemmap accounting
扩展 section_nr_vmemmap_pages() 识别 section-based 优化 section,用 struct mem_section 中存的 compound page order 和 HVO 保留页数计算 vmemmap 页数,支持 DAX/HVO 核算。
6/17
mm/mm_init: factor out pfn_to_zone()
把 hugetlb_vmemmap.c 的 pfn_to_zone() 移到 mm_init.c 并在 mm_init.h 声明,让 __init_deferred_page() 与 HugeTLB early vmemmap 初始化共用,消除重复的 zone 遍历。
7/17
mm/sparse-vmemmap: move helpers ahead of future callers
预移动 vmemmap_alloc_block_zero()/vmemmap_get_tail() 及 section_nr_vmemmap_pages() 到前面,供 PTE population 和 sparse_init_nid() 调用,仅代码搬移无功能变化。
8/17
mm/sparse-vmemmap: support section-based vmemmap optimization
sparse-vmemmap population 路径根据 section 元数据中的 compound page order 决定优化并直接复用/分配共享 tail vmemmap 页,替代 HugeTLB 专用逻辑,为 DAX 等复用铺路。
9/17
mm/sparse: initialize memory sections earlier
把 memblock 范围的 sparsemem section 元数据初始化从 sparse_init() 提前到 mm_core_init_early(),重命名 sparse_sections_init(),使 HugeTLB bootmem 分配前 section 元数据已可用。
10/17
mm/hugetlb: switch HugeTLB to section-based vmemmap optimization
HugeTLB 分配 bootmem huge page 时记录 compound page order 到 section 元数据,删除专用 pre-HVO 早期填充逻辑,改用通用 section-based sparse-vmemmap 路径处理共享 tail 映射。
11/17
mm/sparse-vmemmap: remove SPARSEMEM_VMEMMAP_PREINIT support
删除仅服务于 HugeTLB 早期 vmemmap 优化的 SPARSEMEM_VMEMMAP_PREINIT Kconfig、section flag 和空 early hook,present section 统一走正常 sparse 初始化路径。
12/17
mm/sparse: inline usemap allocation into sparse_init_nid()
在 sparse_init_nid() 中直接分配 usemap buffer 并传给 sparse_init_one_section(),删除 sparse_usage_init/fini 和 sparse_init_early_section 等临时状态封装。
13/17
mm/sparse: remove section_map_size()
section_map_size() 仅剩 !CONFIG_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,改用 section 元数据中的 compound page order 判断 bootmem folio 是否已 vmemmap 优化,避免冗余状态。
15/17
mm/hugetlb: remove HUGE_BOOTMEM_CMA
用 hstate 跟踪早期 CMA hugetlb 页,移除冗余的 HUGE_BOOTMEM_CMA 标志及未使用 helper,精简 bootmem 元数据。
16/17
mm/hugetlb: localize struct huge_bootmem_page
让 hugetlb_vmemmap_optimize_bootmem_page() 改收 PFN 和 order,不再暴露 struct huge_bootmem_page,将其定义从 mm/internal.h 移入 mm/hugetlb.c 并解除头文件依赖。
17/17
mm/hugetlb: localize HUGE_BOOTMEM_ZONES_VALID
将仅用于 mm/hugetlb.c 中 huge_bootmem_page 标志处理的 HUGE_BOOTMEM_ZONES_VALID 定义移到该私有结构附近,不再经公共 hugetlb 头暴露。