mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
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 commit966cf44f63("mm: defer ZONE_DEVICE page initialization to the point where we init pgmap") and no longer makes sense here. Link: https://lore.kernel.org/20260428081855.1249045-6-songmuchun@bytedance.com Fixes:c4386bd8ee("mm/memremap: add ZONE_DEVICE support for compound pages") Signed-off-by: Muchun Song <songmuchun@bytedance.com> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org> Reviewed-by: Oscar Salvador <osalvador@suse.de> Acked-by: David Hildenbrand (Arm) <david@kernel.org> Acked-by: Liam R. Howlett <liam@infradead.org> Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com> Cc: Joao Martins <joao.m.martins@oracle.com> Cc: Lorenzo Stoakes <ljs@kernel.org> Cc: Madhavan Srinivasan <maddy@linux.ibm.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Michal Hocko <mhocko@suse.com> Cc: Nicholas Piggin <npiggin@gmail.com> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Vlastimil Babka <vbabka@kernel.org> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
721a73e30c
commit
94405c6136
34
mm/mm_init.c
34
mm/mm_init.c
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user