v5
2026-08-25
基于section的HugeTLB vmemmap优化 · v5
HugeTLB vmemmap改用基于section的共享尾页优化,调整初始化/记账并删除旧PREINIT路径。
原始补丁链接
子 Patch(17)
1/17
mm/sparse: relax struct mem_section size constraints
section 查找改用取模代替掩码,放宽 mem_section 大小须为 2 的幂的要求,仍保持双字对齐,便于未来增删字段无需填充或布局检查。
2/17
mm/sparse-vmemmap: rename HVO order macros
将 VMEMMAP_TAIL_MIN_ORDER/NR_VMEMMAP_TAILS 重命名为 VMEMMAP_OPTIMIZATION_* 前缀,使宏名表达优化要求而非 tail-page 缓存实现细节;无功能变化。
3/17
mm/mm_init: skip initializing shared vmemmap tail pages
memmap_init_range() 初始化会覆盖 HVO compound 的共享 tail vmemmap 页;改为通过 section 记录的 order 跳过这些页,循环后再初始化 pageblock migratetype,避免冗余写并统一处理。
4/17
mm/sparse-vmemmap: initialize shared tail vmemmap pages on allocation
On 8/25/26 4:45 PM, Muchun Song wrote: > The shared tail vmemmap page allocated in vmemmap_get_tail() used to be > left uninitialized, because memmap_init_range() would later overwrite > it. That for
5/17
mm/sparse-vmemmap: support section-based vmemmap accounting
On 8/25/26 4:45 PM, Muchun Song wrote: > section_nr_vmemmap_pages() can account ordinary sections and DAX sections, > but section-based vmemmap optimization keeps its compound order in struct > mem_se
6/17
mm/mm_init: factor out pfn_to_zone()
On 8/25/26 4:45 PM, Muchun Song wrote: > pfn_to_zone() in hugetlb_vmemmap.c duplicates the zone lookup logic in > __init_deferred_page(). > > Move it to mm_init.c, declare it in mm/mm_init.h, and reu
7/17
mm/sparse-vmemmap: move helpers ahead of future callers
On 8/25/26 4:45 PM, Muchun Song wrote: > Prepare for section-based vmemmap optimization by moving helpers that > follow-up changes will use. vmemmap_get_tail() will be called from the PTE > population
8/17
mm/sparse-vmemmap: support section-based vmemmap optimization
sparse-vmemmap populate 根据 section 元数据中的 compound order 直接分配或复用共享 tail vmemmap 页,取代 HugeTLB 专用预填充,为 HugeTLB/DAX 共用同一优化路径做准备。
9/17
mm/sparse: initialize memory sections earlier
把 sparsemem section 元数据初始化提前到 mm_core_init_early(),在 free_area_init()/HugeTLB bootmem 之前执行,并改名 sparse_sections_init();这是后续 HugeTLB 使用 section 信息的预备补丁。
10/17
mm/hugetlb: switch HugeTLB to section-based vmemmap optimization
HugeTLB bootmem 不再走自己的早期 vmemmap 预填充,而是在分配时把 order 写入 section,由通用 sparse-vmemmap 分配共享 tail 页;删除重复的 HVO 专用 early setup。
11/17
mm/sparse-vmemmap: remove SPARSEMEM_VMEMMAP_PREINIT support
删除 SPARSEMEM_VMEMMAP_PREINIT 的 Kconfig、section flag 与空 early hook;HugeTLB 已改用 section-based 路径,present sections 统一走正常 sparse-vmemmap 初始化。
12/17
mm/sparse: inline usemap allocation into sparse_init_nid()
移除 sparse_usagebuf 及 sparse_usage_init/fini、sparse_init_early_section() 包装,在 sparse_init_nid() 中直接分配 usemap 并传给 sparse_init_one_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 标志反映旧的 early 预填充状态;现在 section order 已能表达,移除该 flag 和 helper,标记 folio vmemmap-optimized 时直接查 section 状态。
15/17
mm/hugetlb: remove HUGE_BOOTMEM_CMA
删除 HUGE_BOOTMEM_CMA,早期 CMA hugetlb 页改由 hstate 跟踪;去掉冗余 bootmem 标志和未使用 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
HUGE_BOOTMEM_ZONES_VALID 仅 mm/hugetlb.c 的 huge_bootmem_page 标志处理使用,从公共 hugetlb.h 移到该文件内定义;无功能变化。