From 3d670c0dcea42afd021fe15c7438f7a48c63b552 Mon Sep 17 00:00:00 2001 From: Muchun Song Date: Sat, 10 Oct 2026 15:57:55 +0800 Subject: [PATCH] mm/mm_init: add zone mismatch warning during page init For vmemmap-optimized sections, tail struct pages may be backed by shared vmemmap pages. Those shared pages must carry the same page zone ID as the struct pages initialized for the section. Warn in __init_single_page() if the shared tail page has a different page_zone_id(), which would indicate inconsistent initialization. [muchun.song@linux.dev: document ordering of shared and retained struct page initialization] Link: https://lore.kernel.org/20261010115523.4005071-1-songmuchun@bytedance.com Link: https://lore.kernel.org/20261010075755.83339-7-songmuchun@bytedance.com Signed-off-by: Muchun Song Signed-off-by: Andrew Morton Reviewed-by: Lance Yang Acked-by: Qi Zheng Cc: Madhavan Srinivasan Cc: Mike Rapoport Cc: David Hildenbrand Cc: Michael Ellerman Cc: Nicholas Piggin Cc: Christophe Leroy Cc: Ritesh Harjani (IBM) Cc: Shrikanth Hegde Cc: Lorenzo Stoakes Cc: Liam R. Howlett Cc: Vlastimil Babka Cc: Suren Baghdasaryan Cc: Michal Hocko --- mm/mm_init.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mm/mm_init.c b/mm/mm_init.c index 1650d6bc1211..4c17a892924d 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -593,6 +593,15 @@ static void __init find_zone_movable_pfns_for_nodes(void) node_states[N_MEMORY] = saved_node_state; } +static inline void vmemmap_optimization_verify_zone(struct page *page) +{ + const unsigned int order = pfn_to_section_compound_order(page_to_pfn(page)); + + VM_WARN_ON_ONCE(vmemmap_optimizable_order(order) && + page_zone_id(page + VMEMMAP_OPTIMIZATION_NR_STRUCT_PAGES) != + page_zone_id(page)); +} + void __meminit __init_single_page(struct page *page, unsigned long pfn, unsigned long zone, int nid) { @@ -609,6 +618,11 @@ void __meminit __init_single_page(struct page *page, unsigned long pfn, if (!is_highmem_idx(zone)) set_page_address(page, __va(pfn << PAGE_SHIFT)); #endif + /* + * Shared tail struct pages are initialized during vmemmap population, + * before retained struct pages reach here. + */ + vmemmap_optimization_verify_zone(page); } #ifdef CONFIG_NUMA