Re: [PATCH v3 16/21] mm/mm_init: init deferred page migratetype in deferred_init_pages()
Mike Rapoport <[email protected]> Wed, 15 Jul 2026 12:35:19 +0300
| Newsgroups | org.infradead.lists.kexec,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <178410811938.820181.10032776847430752177.b4-review@b4> |
> The deferred pages are initialized in deferred_init_pages(), but their > migratetype is initialized later when freeing them in > deferred_free_pages(). Setting the migrate type is part of initializing > the pages, so move it to deferred_init_pages(). > > This simplifies the logic in deferred_free_pages(), which now only does > the freeing. For non-max-order-aligned pages, it also drops the > if (pageblock_aligned) for each freed page, which in theory should be a > tiny bit faster. > > Another motivation for this change is that in a coming patch, KHO will > need to update the migrate type for its scratch pages. Moving all the > pageblock init in one place makes that simpler. > > Signed-off-by: Pratyush Yadav (Google) <[email protected]> > > diff --git a/mm/mm_init.c b/mm/mm_init.c > index 84d4b1c997bc2..bd9dc1829005b 100644 > --- a/mm/mm_init.c > +++ b/mm/mm_init.c > @@ -1985,8 +1985,6 @@ static void __init deferred_free_pages(unsigned long pfn, There's migratetype parameter in deferred_free_pages(), looks like it's not needed anymore. > /* Free a large naturally-aligned chunk if possible */ > if (nr_pages == MAX_ORDER_NR_PAGES && IS_MAX_ORDER_ALIGNED(pfn)) { > - for (i = 0; i < nr_pages; i += pageblock_nr_pages) > - init_pageblock_migratetype(page + i, mt, false); > __free_pages_core(page, MAX_PAGE_ORDER, MEMINIT_EARLY); > return; > } > @@ -1994,11 +1992,8 @@ static void __init deferred_free_pages(unsigned long pfn, > /* Accept chunks smaller than MAX_PAGE_ORDER upfront */ > accept_memory(PFN_PHYS(pfn), nr_pages * PAGE_SIZE); > > - for (i = 0; i < nr_pages; i++, page++, pfn++) { > - if (pageblock_aligned(pfn)) > - init_pageblock_migratetype(page, mt, false); > + for (i = 0; i < nr_pages; i++, page++, pfn++) > __free_pages_core(page, 0, MEMINIT_EARLY); > - } > } > > /* Completion tracking for deferred_init_memmap() threads */ > @@ -2017,15 +2012,23 @@ static inline void __init pgdat_init_report_one_done(void) > * Return number of pages initialized. > */ > static unsigned long __init deferred_init_pages(struct zone *zone, > - unsigned long pfn, unsigned long end_pfn) > + unsigned long start_pfn, unsigned long end_pfn, > + enum migratetype mt) > { > int nid = zone_to_nid(zone); > - unsigned long nr_pages = end_pfn - pfn; > + unsigned long nr_pages = end_pfn - start_pfn, pfn = start_pfn; Let's declare pfn on a separate line please. -- Sincerely yours, Mike.