FAILED: patch "[PATCH] mm/mm_init: fix pageblock migratetype for ZONE_DEVICE" failed to apply to 6.6-stable tree
[email protected]
maintainerThe patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x 94405c6136839f7c462249c8b4b957bcb9527a9d
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026072014-sincere-blooper-afaf@gregkh' --subject-prefix 'PATCH 6.6.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 94405c6136839f7c462249c8b4b957bcb9527a9d Mon Sep 17 00:00:00 2001
From: Muchun Song <[email protected]>
Date: Tue, 28 Apr 2026 16:18:54 +0800
Subject: [PATCH] mm/mm_init: fix pageblock migratetype for ZONE_DEVICE
compound pages
The memmap_init_zone_device() function only initializes the migratetype of the first pageblock of a compound page. If the compound page size exceeds pageblock_nr_pages (e.g., 1GB hugepages with 2MB pageblocks), subsequent pageblocks in the compound page remain uninitialized.
Move the migratetype initialization out of __init_zone_device_page() and into a separate pageblock_migratetype_init_range() function. This iterates over the entire PFN range of the memory, ensuring that all pageblocks are correctly initialized.
Also remove the stale confusing comment about MEMINIT_HOTPLUG above the migratetype setting since it is an obsolete relic from commit 966cf44f637e ("mm: defer ZONE_DEVICE page initialization to the point where we init pgmap") and no longer makes sense here.
mm/mm_init.c +19 -15
@@ -674,6 +674,20 @@ static inline void fixup_hashdist(void)static inline void fixup_hashdist (void ) {}#endif /* CONFIG_NUMA */ +#ifdef CONFIG_ZONE_DEVICE +static __meminit void pageblock_migratetype_init_range (unsigned long pfn, +unsigned long nr_pages,int migratetype) +{ +const unsigned long end = pfn + nr_pages; + +for (pfn =pageblock_align (pfn); pfn < end; pfn += pageblock_nr_pages) { +init_pageblock_migratetype (pfn_to_page (pfn), migratetype, false); +if (IS_ALIGNED (pfn,PAGES_PER_SECTION )) +cond_resched (); + } +} +#endif +/* * Initialize a reserved page unconditionally, finding its zone first. */
@@ -1011,21 +1025,6 @@ static void __ref __init_zone_device_page(struct page *page, unsigned long pfn,page_folio (page)->pgmap = pgmap; page->zone_device_data =NULL ; -/* -* Mark the block movable so that blocks are reserved for -* movable at startup. This will force kernel allocations -* to reserve their blocks rather than leaking throughout -* the address space during boot when many long-lived -* kernel allocations are made. -* -* Please note that MEMINIT_HOTPLUG path doesn't clear memmap -* because this is done early in section_activate() -*/ -if (pageblock_aligned (pfn)) { -init_pageblock_migratetype (page,MIGRATE_MOVABLE , false); -cond_resched (); - } -/* * ZONE_DEVICE pages other than MEMORY_TYPE_GENERIC are released * directly to the driver page allocator which will set the page count
@@ -1122,6 +1121,9 @@ void __ref memmap_init_zone_device(struct zone *zone,__init_zone_device_page (page, pfn, zone_idx, nid, pgmap); +if (IS_ALIGNED (pfn,PAGES_PER_SECTION )) +cond_resched (); +if (pfns_per_compound ==1 )continue ;
@@ -1129,6 +1131,8 @@ void __ref memmap_init_zone_device(struct zone *zone, compound_nr_pages(altmap, pgmap)); } +pageblock_migratetype_init_range (start_pfn, nr_pages,MIGRATE_MOVABLE ); +pr_debug ("%s initialised %lu pages in %ums\n" , __func__, nr_pages,jiffies_to_msecs (jiffies - start)); }
Sasha Levin
maintainerPATCH 1/1 mm/mm_init: fix pageblock migratetype for ZONE_DEVICE compound pages
From: Muchun Song <[email protected]>
[ Upstream commit 94405c6136839f7c462249c8b4b957bcb9527a9d ]
The memmap_init_zone_device() function only initializes the migratetype of the first pageblock of a compound page. If the compound page size exceeds pageblock_nr_pages (e.g., 1GB hugepages with 2MB pageblocks), subsequent pageblocks in the compound page remain uninitialized.
Move the migratetype initialization out of __init_zone_device_page() and into a separate pageblock_migratetype_init_range() function. This iterates over the entire PFN range of the memory, ensuring that all pageblocks are correctly initialized.
Also remove the stale confusing comment about MEMINIT_HOTPLUG above the migratetype setting since it is an obsolete relic from commit 966cf44f637e ("mm: defer ZONE_DEVICE page initialization to the point where we init pgmap") and no longer makes sense here.
--- mm/mm_init.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-)
mm/mm_init.c +19 -15
@@ -649,6 +649,20 @@ static inline void fixup_hashdist(void)static inline void fixup_hashdist (void ) {}#endif /* CONFIG_NUMA */ +#ifdef CONFIG_ZONE_DEVICE +static __meminit void pageblock_migratetype_init_range (unsigned long pfn, +unsigned long nr_pages,int migratetype) +{ +const unsigned long end = pfn + nr_pages; + +for (pfn =pageblock_align (pfn); pfn < end; pfn += pageblock_nr_pages) { +set_pageblock_migratetype (pfn_to_page (pfn), migratetype); +if (IS_ALIGNED (pfn,PAGES_PER_SECTION )) +cond_resched (); + } +} +#endif +#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT static inline void pgdat_set_deferred_range (pg_data_t *pgdat) {
@@ -992,21 +1006,6 @@ static void __ref __init_zone_device_page(struct page *page, unsigned long pfn, page->pgmap = pgmap; page->zone_device_data =NULL ; -/* -* Mark the block movable so that blocks are reserved for -* movable at startup. This will force kernel allocations -* to reserve their blocks rather than leaking throughout -* the address space during boot when many long-lived -* kernel allocations are made. -* -* Please note that MEMINIT_HOTPLUG path doesn't clear memmap -* because this is done early in section_activate() -*/ -if (pageblock_aligned (pfn)) { -set_pageblock_migratetype (page,MIGRATE_MOVABLE ); -cond_resched (); - } -/* * ZONE_DEVICE pages are released directly to the driver page allocator * which will set the page count to 1 when allocating the page.
@@ -1098,6 +1097,9 @@ void __ref memmap_init_zone_device(struct zone *zone,__init_zone_device_page (page, pfn, zone_idx, nid, pgmap); +if (IS_ALIGNED (pfn,PAGES_PER_SECTION )) +cond_resched (); +if (pfns_per_compound ==1 )continue ;
@@ -1105,6 +1107,8 @@ void __ref memmap_init_zone_device(struct zone *zone, compound_nr_pages(pfn, altmap, pgmap)); } +pageblock_migratetype_init_range (start_pfn, nr_pages,MIGRATE_MOVABLE ); +pr_debug ("%s initialised %lu pages in %ums\n" , __func__, nr_pages,jiffies_to_msecs (jiffies - start)); }
Signature · 1 line
2.53.0