From: Mike Rapoport <rppt@kernel.org>
To: Mukesh Pilaniya <mpilaniy@redhat.com>
Cc: Pasha Tatashin <pasha.tatashin@soleen.com>,
Pratyush Yadav <pratyush@kernel.org>,
Alexander Graf <graf@amazon.com>,
Andrew Morton <akpm@linux-foundation.org>,
Chen Pei <cp0613@linux.alibaba.com>,
George Guo <guodongtai@kylinos.cn>,
Kexin Liu <liukexin@kylinos.cn>,
Sourabh Jain <sourabhjain@linux.ibm.com>,
kexec@lists.infradead.org, linux-kernel@vger.kernel.org,
linux-mm@kvack.org
Subject: Re: [PATCH v2 1/3] kho: walk bootmem areas in address order
Date: Thu, 12 Nov 2026 10:49:46 +0200 [thread overview]
Message-ID: <avV9qoaPMBLCNOXD@kernel.org> (raw)
In-Reply-To: <990cc079-70ab-4fcf-9974-679aaf07849e@redhat.com>
On Thu, Nov 12, 2026 at 12:02:05PM +0530, Mukesh Pilaniya wrote:
> Hi Mike,
>
> On 04/11/26 10:20 pm, Mike Rapoport (Microsoft) wrote:
> > kexec_add_buffer() users may depend on the order in which memory holes are
> > searched. For instance, arm64 places the kernel bottom-up and then
> > requires the DTB to be above the kernel.
> >
> > kho_walk_bootmem() walks the bootmem areas in the order they were
> > reserved, so if the kernel lands in a small area at the top of the memory
> > there is no room left for the DTB and kexec fails. For example, on an
> > arm64 VM with 2G of RAM and kho_bootmem=8M,64M,64M, the lowmem area is
> > reserved first at the top of the memory, the kernel image takes most of
> > it and kexec fails with
> >
> > kexec_file(Image): Could not find any suitable kernel location!
> >
> > Sort the bootmem areas by address and walk them in ascending order, or in
> > descending order for top-down searches, like kexec_walk_resources() does.
> >
> > Fixes: 3bdecc3c93f9 ("kexec: add KHO support to kexec file loads")
> > Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> > ---
> > kernel/liveupdate/kexec_handover.c | 57 ++++++++++++++++++++++++++++++--------
> > 1 file changed, 46 insertions(+), 11 deletions(-)
> >
> > diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c
> > index 6f1f55fe31819..2ac5d94f33fd4 100644
> > --- a/kernel/liveupdate/kexec_handover.c
> > +++ b/kernel/liveupdate/kexec_handover.c
> > @@ -26,6 +26,7 @@
> > #include <linux/list.h>
> > #include <linux/memblock.h>
> > #include <linux/page-isolation.h>
> > +#include <linux/sort.h>
> > #include <linux/unaligned.h>
> > #include <linux/vmalloc.h>
> >
> > @@ -820,6 +821,14 @@ bool kho_bootmem_overlap(phys_addr_t phys, size_t size)
> > return false;
> > }
> >
> > +static int __init kho_bootmem_cmp(const void *_a, const void *_b)
> > +{
> > + const struct kho_bootmem *a = _a;
> > + const struct kho_bootmem *b = _b;
> > +
> > + return cmp_int(a->addr, b->addr);
> > +}
> > +
> > /**
> > * kho_reserve_bootmem - Reserve a contiguous chunk of memory for kexec
> > *
> > @@ -904,6 +913,9 @@ static void __init kho_reserve_bootmem(void)
> > */
> > kho_bootmem_cnt = i;
> >
> > + sort(kho_bootmem, kho_bootmem_cnt, sizeof(*kho_bootmem),
> > + kho_bootmem_cmp, NULL);
> This only covers the case where this kernel allocated the areas itself.
> On a KHO boot the array comes from the previous kernel. A kernel with
> this series that is handed over from one without it therefore keeps
> walking the areas in reservation order for every following
> kexec_file_load, and the arm64 failure you describe comes back until the
> next cold boot and vise versa because the ABI string is still
> "kho-v4".
If we were able to kexec from a kernel with no reservation ordering, the
issue is not there, isn't it?
And after a cycle of KHO boots to newer kernels we anyway can get to the
point when bootmem is not large enough.
> > +static int kho_bootmem_walk_top_down(struct kexec_buf *kbuf,
> > + int (*func)(struct resource *, void *))
> > {
> > int ret = 0;
> > - int i;
> >
> > - for (i = 0; i < kho_bootmem_cnt; i++) {
> > - struct resource res = {
> > - .start = kho_bootmem[i].addr,
> > - .end = kho_bootmem[i].addr + kho_bootmem[i].size - 1,
> > - };
> > + for (int i = kho_bootmem_cnt - 1; i >= 0; i--) {
>
> kho_bootmem_cnt is unsigned, but the reverse loops in
> kho_reserve_bootmem() and kho_bootmem_walk_top_down() start an int
> counter at kho_bootmem_cnt - 1, which for a zero count is UINT_MAX
> converted to int. That conversion is implementation-defined; with the
> current compilers it yields -1 and the loop body is skipped.
We never get here with kho_bootmem_cnt == 0.
> How about using this one.
> for (unsigned int i = kho_bootmem_cnt; i-- > 0;)
>
> Reviewed-by: Mukesh Pilaniya <mpilaniy@redhat.com>
Thanks!
> --
> Regards,
> Mukesh Pilaniya
>
--
Sincerely yours,
Mike.
next prev parent reply other threads:[~2026-11-12 8:49 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-04 16:50 [PATCH v2 0/3] kho: fix bootmem sizing Mike Rapoport (Microsoft)
2026-11-04 16:50 ` [PATCH v2 1/3] kho: walk bootmem areas in address order Mike Rapoport (Microsoft)
2026-11-04 18:57 ` Pasha Tatashin
2026-11-04 22:14 ` Jose A. Perez de Azpillaga
2026-11-10 16:52 ` Pratyush Yadav
2026-11-12 6:32 ` Mukesh Pilaniya
2026-11-12 8:49 ` Mike Rapoport [this message]
2026-11-04 16:50 ` [PATCH v2 2/3] kho: skip zero-sized lowmem and global bootmem areas Mike Rapoport (Microsoft)
2026-11-04 18:57 ` Pasha Tatashin
2026-11-04 22:17 ` Jose A. Perez de Azpillaga
2026-11-10 16:55 ` Pratyush Yadav
2026-11-12 6:48 ` Mukesh Pilaniya
2026-11-04 16:50 ` [PATCH v2 3/3] kho: fix bootmem sizing Mike Rapoport (Microsoft)
2026-11-04 18:57 ` Pasha Tatashin
2026-11-05 9:26 ` Mike Rapoport
2026-11-04 22:17 ` Jose A. Perez de Azpillaga
2026-11-10 16:54 ` Pratyush Yadav
2026-11-12 7:21 ` Mukesh Pilaniya
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=avV9qoaPMBLCNOXD@kernel.org \
--to=rppt@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=cp0613@linux.alibaba.com \
--cc=graf@amazon.com \
--cc=guodongtai@kylinos.cn \
--cc=kexec@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=liukexin@kylinos.cn \
--cc=mpilaniy@redhat.com \
--cc=pasha.tatashin@soleen.com \
--cc=pratyush@kernel.org \
--cc=sourabhjain@linux.ibm.com \
/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.