v1
2026-11-09
统一复合页memmap初始化 · v1
统一启动时 gigantic HugeTLB 页与 compound ZONE_DEVICE 的 struct page 初始化,复用 sparse-vmemmap 公共路径以完成 HVO 泛化。
原始补丁链接
子 Patch(11)
1/11
mm/mm_init: verify zones for template-initialized pages
在模板复制初始化ZONE_DEVICE页后增加vmemmap zone一致性校验,因为该快速路径绕过__init_single_page(),原先缺少同样的验证。
2/11
mm/mm_init: factor out common struct page initialization
抽出memmap_init_page_common()统一PFN无关的struct page初值,供普通页和vmemmap共享尾页复用,并补齐共享尾页的last cpupid与KASAN tag初始化。
3/11
mm/mm_init: simplify zone device page initialization
重构ZONE_DEVICE头/尾模板,直接由PFN无关状态并补pgmap、refcount及compound元数据,使首页也走zone_device_page_init_from_template(),消除特殊处理。
4/11
mm/mm_init: factor out frozen compound page initialization
抽出memmap_init_compound_page_frozen()统一冻结refcount下的compound页初始化,保留pgmap绑定和MEMORY_DEVICE_GENERIC引用计数处理,供早期memmap用户复用。
5/11
mm/hugetlb: drop boot-time HVO handling for gigantic folios
删除boot-time HugeTLB HVO对gigantic folio的额外批量优化与回退,因x86-64/riscv64巨型页可由section-based vmemmap优化覆盖,LoongArch无巨型HVO页。
6/11
mm/hugetlb: initialize all struct pages for bootmem hugepages
bootmem巨型页整体标记noinit,并在hugetlb_folio_init_vmemmap()中初始化head struct page,集中复合页设置,并合并连续noinit区以降低memblock元数据开销。
7/11
mm/hugetlb: use common compound page initialization helper
boot-time巨型hugetlb folio改用memmap_init_compound_page_frozen()完成冻结refcount下的复合页初始化,删除两处open-coded helper,与ZONE_DEVICE共享规则。
8/11
mm/mm_init: make __init_single_page() static
__init_single_page()仅由mm/mm_init.c内部使用,改为static并移除mm_init.h声明,减少外部符号暴露。
9/11
mm/cma: centralize CMA pageblock initialization
将cma_reserve_early()早预留pageblock的migratetype与CMA统计初始化移入cma_activate_area()统一处理;激活失败时恢复这些仍归调用者的页的managed计数。
10/11
mm/cma: localize init_cma_pageblock() to cma.c
把init_cma_pageblock()从mm/mm_init.c迁到mm/cma.c,与唯一使用它的CMA代码放在一起,并移除mm_init.h中的声明,无功能变化。
11/11
mm/mm_init: move pageblock migratetype init to memmap helpers
把MIGRATE_MOVABLE pageblock初始化移入冻结memmap helper,单页/复合页分别设范围,使ZONE_DEVICE与hugetlb bootmem共用;CMA页块随后由cma_activate_area()覆盖。