From: Mike Rapoport <rppt@kernel.org>
To: Michal Clapinski <mclapinski@google.com>
Cc: Evangelos Petrongonas <epetron@amazon.de>,
Pasha Tatashin <pasha.tatashin@soleen.com>,
Pratyush Yadav <pratyush@kernel.org>,
Alexander Graf <graf@amazon.com>,
kexec@lists.infradead.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH v4 1/2] kho: fix deferred init of kho scratch
Date: Mon, 23 Feb 2026 13:07:41 +0200 [thread overview]
Message-ID: <aZw0_c8TdTYvm2SV@kernel.org> (raw)
In-Reply-To: <20260220165203.3213375-2-mclapinski@google.com>
On Fri, Feb 20, 2026 at 05:52:02PM +0100, Michal Clapinski wrote:
> Currently, mm_core_init calls kho_memory_init, which calls
> kho_release_scratch.
>
> If DEFERRED is enabled, kho_release_scratch will first initialize the
> struct pages of kho scratch. This is not needed. We can just let
> page_alloc_init_late init it.
>
> Next, kho_release_scratch will mark scratch as MIGRATE_CMA. If DEFERRED
> is enabled, this will be overwritten later in deferred_free_pages.
>
> To fix this, I removed the whole kho_release_scratch.
> Marking the pageblocks as MIGRATE_CMA now happens in kho_init, which
> runs after deferred_free_pages.
>
> Signed-off-by: Michal Clapinski <mclapinski@google.com>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> ---
> include/linux/memblock.h | 2 --
> kernel/liveupdate/kexec_handover.c | 43 ++++++++----------------------
> mm/memblock.c | 22 ---------------
> 3 files changed, 11 insertions(+), 56 deletions(-)
>
> diff --git a/include/linux/memblock.h b/include/linux/memblock.h
> index 221118b5a16e..35d9cf6bbf7a 100644
> --- a/include/linux/memblock.h
> +++ b/include/linux/memblock.h
> @@ -614,11 +614,9 @@ static inline void memtest_report_meminfo(struct seq_file *m) { }
> #ifdef CONFIG_MEMBLOCK_KHO_SCRATCH
> void memblock_set_kho_scratch_only(void);
> void memblock_clear_kho_scratch_only(void);
> -void memmap_init_kho_scratch_pages(void);
> #else
> static inline void memblock_set_kho_scratch_only(void) { }
> static inline void memblock_clear_kho_scratch_only(void) { }
> -static inline void memmap_init_kho_scratch_pages(void) {}
> #endif
>
> #endif /* _LINUX_MEMBLOCK_H */
> diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c
> index b851b09a8e99..de167bfa2c8d 100644
> --- a/kernel/liveupdate/kexec_handover.c
> +++ b/kernel/liveupdate/kexec_handover.c
> @@ -1377,11 +1377,6 @@ static __init int kho_init(void)
> if (err)
> goto err_free_fdt;
>
> - if (fdt) {
> - kho_in_debugfs_init(&kho_in.dbg, fdt);
> - return 0;
> - }
> -
> for (int i = 0; i < kho_scratch_cnt; i++) {
> unsigned long base_pfn = PHYS_PFN(kho_scratch[i].addr);
> unsigned long count = kho_scratch[i].size >> PAGE_SHIFT;
> @@ -1397,8 +1392,17 @@ static __init int kho_init(void)
> */
> kmemleak_ignore_phys(kho_scratch[i].addr);
> for (pfn = base_pfn; pfn < base_pfn + count;
> - pfn += pageblock_nr_pages)
> - init_cma_reserved_pageblock(pfn_to_page(pfn));
> + pfn += pageblock_nr_pages) {
> + if (fdt)
> + init_cma_pageblock(pfn_to_page(pfn));
> + else
> + init_cma_reserved_pageblock(pfn_to_page(pfn));
> + }
> + }
> +
> + if (fdt) {
> + kho_in_debugfs_init(&kho_in.dbg, fdt);
> + return 0;
> }
>
> WARN_ON_ONCE(kho_debugfs_fdt_add(&kho_out.dbg, "fdt",
> @@ -1421,35 +1425,10 @@ static __init int kho_init(void)
> }
> fs_initcall(kho_init);
>
> -static void __init kho_release_scratch(void)
> -{
> - phys_addr_t start, end;
> - u64 i;
> -
> - memmap_init_kho_scratch_pages();
> -
> - /*
> - * Mark scratch mem as CMA before we return it. That way we
> - * ensure that no kernel allocations happen on it. That means
> - * we can reuse it as scratch memory again later.
> - */
> - __for_each_mem_range(i, &memblock.memory, NULL, NUMA_NO_NODE,
> - MEMBLOCK_KHO_SCRATCH, &start, &end, NULL) {
> - ulong start_pfn = pageblock_start_pfn(PFN_DOWN(start));
> - ulong end_pfn = pageblock_align(PFN_UP(end));
> - ulong pfn;
> -
> - for (pfn = start_pfn; pfn < end_pfn; pfn += pageblock_nr_pages)
> - init_pageblock_migratetype(pfn_to_page(pfn),
> - MIGRATE_CMA, false);
> - }
> -}
> -
> void __init kho_memory_init(void)
> {
> if (kho_in.mem_map_phys) {
> kho_scratch = phys_to_virt(kho_in.scratch_phys);
> - kho_release_scratch();
> kho_mem_deserialize(phys_to_virt(kho_in.mem_map_phys));
> } else {
> kho_reserve_scratch();
> diff --git a/mm/memblock.c b/mm/memblock.c
> index 6cff515d82f4..3eff19124fc0 100644
> --- a/mm/memblock.c
> +++ b/mm/memblock.c
> @@ -959,28 +959,6 @@ __init void memblock_clear_kho_scratch_only(void)
> {
> kho_scratch_only = false;
> }
> -
> -__init void memmap_init_kho_scratch_pages(void)
> -{
> - phys_addr_t start, end;
> - unsigned long pfn;
> - int nid;
> - u64 i;
> -
> - if (!IS_ENABLED(CONFIG_DEFERRED_STRUCT_PAGE_INIT))
> - return;
> -
> - /*
> - * Initialize struct pages for free scratch memory.
> - * The struct pages for reserved scratch memory will be set up in
> - * reserve_bootmem_region()
> - */
> - __for_each_mem_range(i, &memblock.memory, NULL, NUMA_NO_NODE,
> - MEMBLOCK_KHO_SCRATCH, &start, &end, &nid) {
> - for (pfn = PFN_UP(start); pfn < PFN_DOWN(end); pfn++)
> - init_deferred_page(pfn, nid);
> - }
> -}
> #endif
>
> /**
> --
> 2.53.0.345.g96ddfc5eaa-goog
>
--
Sincerely yours,
Mike.
next prev parent reply other threads:[~2026-02-23 11:08 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-20 16:52 [PATCH v4 0/2] kho: add support for deferred struct page init Michal Clapinski
2026-02-20 16:52 ` [PATCH v4 1/2] kho: fix deferred init of kho scratch Michal Clapinski
2026-02-23 11:07 ` Mike Rapoport [this message]
2026-02-20 16:52 ` [PATCH v4 2/2] kho: make preserved pages compatible with deferred struct page init Michal Clapinski
2026-02-24 18:30 ` Andrew Morton
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=aZw0_c8TdTYvm2SV@kernel.org \
--to=rppt@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=epetron@amazon.de \
--cc=graf@amazon.com \
--cc=kexec@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mclapinski@google.com \
--cc=pasha.tatashin@soleen.com \
--cc=pratyush@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.