[PATCH v3 16/21] mm/mm_init: init deferred page migratetype in deferred_init_pages()
Mike Rapoport
rppt at kernel.org
Wed Jul 15 02:35:19 PDT 2026
> 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) <pratyush at kernel.org>
>
> 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.
More information about the kexec
mailing list