From: Pratyush Yadav <pratyush@kernel.org>
To: Mike Rapoport <rppt@kernel.org>,
Pasha Tatashin <pasha.tatashin@soleen.com>,
Pratyush Yadav <pratyush@kernel.org>,
Alexander Graf <graf@amazon.com>,
Muchun Song <muchun.song@linux.dev>,
Oscar Salvador <osalvador@suse.de>,
David Hildenbrand <david@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Jason Miu <jasonmiu@google.com>,
Jork Loeser <jloeser@linux.microsoft.com>
Cc: kexec@lists.infradead.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org
Subject: [PATCH v3 16/21] mm/mm_init: init deferred page migratetype in deferred_init_pages()
Date: Thu, 9 Jul 2026 19:38:05 +0200 [thread overview]
Message-ID: <20260709173821.429921-17-pratyush@kernel.org> (raw)
In-Reply-To: <20260709173821.429921-1-pratyush@kernel.org>
From: "Pratyush Yadav (Google)" <pratyush@kernel.org>
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@kernel.org>
---
mm/mm_init.c | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/mm/mm_init.c b/mm/mm_init.c
index 84d4b1c997bc..bd9dc1829005 100644
--- a/mm/mm_init.c
+++ b/mm/mm_init.c
@@ -1985,8 +1985,6 @@ static void __init deferred_free_pages(unsigned long pfn,
/* 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;
int zid = zone_idx(zone);
struct page *page = pfn_to_page(pfn);
for (; pfn < end_pfn; pfn++, page++)
__init_single_page(page, pfn, zid, nid);
+
+ /* Now initialize migrate types for these pages. */
+ pfn = pageblock_align(start_pfn);
+ page = pfn_to_page(pfn);
+ for (; pfn < end_pfn; pfn += pageblock_nr_pages, page += pageblock_nr_pages)
+ init_pageblock_migratetype(page, mt, false);
+
return nr_pages;
}
@@ -2067,7 +2070,7 @@ deferred_init_memmap_chunk(unsigned long start_pfn, unsigned long end_pfn,
unsigned long mo_pfn = ALIGN(spfn + 1, MAX_ORDER_NR_PAGES);
unsigned long chunk_end = min(mo_pfn, epfn);
- nr_pages += deferred_init_pages(zone, spfn, chunk_end);
+ nr_pages += deferred_init_pages(zone, spfn, chunk_end, mt);
deferred_free_pages(spfn, chunk_end - spfn, mt);
spfn = chunk_end;
--
2.55.0.141.g00534a21ce-goog
next prev parent reply other threads:[~2026-07-09 17:39 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-09 17:37 [PATCH v3 00/21] kho: make boot time huge page allocation work nicely with KHO Pratyush Yadav
2026-07-09 17:37 ` [PATCH v3 01/21] kho: generalize radix tree APIs Pratyush Yadav
2026-07-09 17:37 ` [PATCH v3 02/21] kho: make radix max key width more obvious Pratyush Yadav
2026-07-15 9:35 ` Mike Rapoport
2026-07-09 17:37 ` [PATCH v3 03/21] kho: disallow wide keys in radix tree Pratyush Yadav
2026-07-09 17:37 ` [PATCH v3 04/21] kho: return virtual address of mem_map Pratyush Yadav
2026-07-15 9:35 ` Mike Rapoport
2026-07-24 16:45 ` Pratyush Yadav
2026-07-09 17:37 ` [PATCH v3 05/21] kho: store incoming radix tree in kho_in Pratyush Yadav
2026-07-09 17:37 ` [PATCH v3 06/21] kho: move all memory retrieval logic to kho_mem_retrieve() Pratyush Yadav
2026-07-09 17:37 ` [PATCH v3 07/21] kho: add a struct for radix callbacks Pratyush Yadav
2026-07-09 17:37 ` [PATCH v3 08/21] kho: add callback for table pages Pratyush Yadav
2026-07-09 17:37 ` [PATCH v3 09/21] kho: add data argument to radix walk callback Pratyush Yadav
2026-07-09 17:37 ` [PATCH v3 10/21] kho: allow early-boot usage of the KHO radix tree Pratyush Yadav
2026-07-09 17:38 ` [PATCH v3 11/21] kho: allow destroying " Pratyush Yadav
2026-07-09 17:38 ` [PATCH v3 12/21] kho: add kho_radix_init_tree() Pratyush Yadav
2026-07-09 17:38 ` [PATCH v3 13/21] kho: expose kho_scratch_overlap() to kexec_handover.h Pratyush Yadav
2026-07-09 17:38 ` [PATCH v3 14/21] kho: initialize kho_scratch pointer earlier in boot Pratyush Yadav
2026-07-09 17:38 ` [PATCH v3 15/21] kho: initialize preserved memory map radix tree earlier Pratyush Yadav
2026-07-09 17:38 ` Pratyush Yadav [this message]
2026-07-15 9:35 ` [PATCH v3 16/21] mm/mm_init: init deferred page migratetype in deferred_init_pages() Mike Rapoport
2026-07-09 17:38 ` [PATCH v3 17/21] mm/mm_init: don't rely on memblock to get KHO scratch migratetype Pratyush Yadav
2026-07-15 9:35 ` Mike Rapoport
2026-07-09 17:38 ` [PATCH v3 18/21] kho: extend scratch Pratyush Yadav
2026-07-15 9:35 ` Mike Rapoport
2026-07-24 16:54 ` Pratyush Yadav
2026-07-09 17:38 ` [PATCH v3 19/21] memblock: make HugeTLB bootmem allocation work with KHO Pratyush Yadav
2026-07-15 9:35 ` Mike Rapoport
2026-07-24 16:51 ` Pratyush Yadav
2026-07-09 17:38 ` [PATCH v3 20/21] memblock: add memblock_reserved_hugetlb_size() Pratyush Yadav
2026-07-09 17:38 ` [PATCH v3 21/21] kho: exclude hugetlb memory from scratch size calculation Pratyush Yadav
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260709173821.429921-17-pratyush@kernel.org \
--to=pratyush@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=david@kernel.org \
--cc=graf@amazon.com \
--cc=jasonmiu@google.com \
--cc=jloeser@linux.microsoft.com \
--cc=kexec@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=muchun.song@linux.dev \
--cc=osalvador@suse.de \
--cc=pasha.tatashin@soleen.com \
--cc=rppt@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.