* [PATCH] kho: do not reserve empty per-node bootmem areas
@ 2026-10-14 13:15 Pratyush Yadav
2026-10-14 13:27 ` sashiko-bot
0 siblings, 1 reply; 3+ messages in thread
From: Pratyush Yadav @ 2026-10-14 13:15 UTC (permalink / raw)
To: Mike Rapoport, Pasha Tatashin, Pratyush Yadav, Alexander Graf
Cc: kexec, linux-mm, linux-kernel, Bing Jiao
From: "Pratyush Yadav (Google)" <pratyush@kernel.org>
Some nodes do not allocate any early boot memory. An example is
hotpluggable nodes with movable_node enabled. So the scratch size for
them ends up being zero. Zero size allocations normally don't play well
with memblock. Memblock returns an address, but then doesn't actually
reserve anything. This address ends up being recorded in kho_bootmem
with a size of 0. In case of hotpluggable nodes with movable_nodes, the
allocation on the node actually fails because memblock refuses to
allocate there, and so KHO fails to initialize.
Skip bootmem reservation for such nodes entirely.
To keep the code more robust, avoid overloading kho_bootmem_cnt. use
max_nr_bootmem to store the size of kho_bootmem array. This ensures that
the location of kho_bootmem_cnt assignment does not affect the cleanup
paths.
Fixes: 3dc92c311498 ("kexec: add Kexec HandOver (KHO) generation helpers")
Reported-by: Bing Jiao <bingjiao@google.com>
Signed-off-by: Pratyush Yadav (Google) <pratyush@kernel.org>
---
kernel/liveupdate/kexec_handover.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c
index 7018e25e4eda..6f1f55fe3181 100644
--- a/kernel/liveupdate/kexec_handover.c
+++ b/kernel/liveupdate/kexec_handover.c
@@ -831,8 +831,8 @@ bool kho_bootmem_overlap(phys_addr_t phys, size_t size)
*/
static void __init kho_reserve_bootmem(void)
{
+ int nid, i = 0, max_nr_bootmem;
phys_addr_t addr, size;
- int nid, i = 0;
if (!kho_enable)
return;
@@ -840,8 +840,8 @@ static void __init kho_reserve_bootmem(void)
bootmem_size_update();
/* FIXME: deal with node hot-plug/remove */
- kho_bootmem_cnt = nodes_weight(node_states[N_MEMORY]) + 2;
- size = kho_bootmem_cnt * sizeof(*kho_bootmem);
+ max_nr_bootmem = nodes_weight(node_states[N_MEMORY]) + 2;
+ size = max_nr_bootmem * sizeof(*kho_bootmem);
kho_bootmem = memblock_alloc(size, PAGE_SIZE);
if (!kho_bootmem) {
pr_err("Failed to reserve bootmem array\n");
@@ -882,6 +882,9 @@ static void __init kho_reserve_bootmem(void)
*/
for_each_node_state(nid, N_MEMORY) {
size = bootmem_size_node(nid);
+ if (!size)
+ continue;
+
addr = memblock_alloc_range_nid(size, BOOTMEM_ALIGNMENT_BYTES,
0, MEMBLOCK_ALLOC_ACCESSIBLE,
nid, true);
@@ -895,13 +898,19 @@ static void __init kho_reserve_bootmem(void)
i++;
}
+ /*
+ * Nodes that needed no bootmem were skipped, so fewer areas than
+ * initially estimated may have been reserved.
+ */
+ kho_bootmem_cnt = i;
+
return;
err_free_bootmem_areas:
for (i--; i >= 0; i--)
memblock_phys_free(kho_bootmem[i].addr, kho_bootmem[i].size);
err_free_bootmem_desc:
- memblock_free(kho_bootmem, kho_bootmem_cnt * sizeof(*kho_bootmem));
+ memblock_free(kho_bootmem, max_nr_bootmem * sizeof(*kho_bootmem));
err_disable_kho:
pr_warn("Failed to reserve bootmem, disabling kexec handover\n");
kho_enable = false;
base-commit: e1fe7daedae7a4a23aca6dbd58e1746750b632dc
--
2.56.0.385.gd3acb90ef8-goog
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] kho: do not reserve empty per-node bootmem areas
2026-10-14 13:15 [PATCH] kho: do not reserve empty per-node bootmem areas Pratyush Yadav
@ 2026-10-14 13:27 ` sashiko-bot
2026-10-14 13:39 ` Pratyush Yadav
0 siblings, 1 reply; 3+ messages in thread
From: sashiko-bot @ 2026-10-14 13:27 UTC (permalink / raw)
To: Pratyush Yadav, Mike Rapoport, Pasha Tatashin, Alexander Graf
Cc: kexec, Bing Jiao
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] kho: incomplete fix for zero-size memblock allocations in bootmem
--
commit 67ab500bd948f5a3b52f1c8170626cb8f1dfc6c3
Author: Pratyush Yadav (Google) <pratyush@kernel.org>
kho: do not reserve empty per-node bootmem areas
Some nodes do not allocate any early boot memory, causing memblock to
return an address without reserving anything when requested with zero size.
This address is recorded in kho_bootmem with a size of 0, and can cause KHO
to fail to initialize. This patch skips bootmem reservation for memoryless
nodes entirely.
> diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c
> index 7018e25e4eda1..6f1f55fe31819 100644
> --- a/kernel/liveupdate/kexec_handover.c
> +++ b/kernel/liveupdate/kexec_handover.c
[ ... ]
> @@ -882,6 +882,9 @@ static void __init kho_reserve_bootmem(void)
> */
> for_each_node_state(nid, N_MEMORY) {
> size = bootmem_size_node(nid);
> + if (!size)
> + continue;
> +
> addr = memblock_alloc_range_nid(size, BOOTMEM_ALIGNMENT_BYTES,
[Severity: High]
This adds a zero-size check for per-node bootmem allocations, but does the
same issue exist for bootmem_size_lowmem and bootmem_size_global?
Looking at kho_reserve_bootmem() just before this hunk, they are allocated
without a similar check:
kernel/liveupdate/kexec_handover.c:kho_reserve_bootmem() {
...
size = bootmem_size_lowmem;
addr = memblock_phys_alloc_range(size, BOOTMEM_ALIGNMENT_BYTES, 0,
ARCH_LOW_ADDRESS_LIMIT);
if (!addr) {
...
size = bootmem_size_global;
addr = memblock_phys_alloc(size, BOOTMEM_ALIGNMENT_BYTES);
if (!addr) {
...
}
If bootmem_size_lowmem or bootmem_size_global evaluates to 0 (for example
via boot parameters or on systems lacking lowmem), will memblock return an
unreserved address and add it to kho_bootmem with size 0? Alternatively,
if the region has no free memory, could the 0-size allocation fail and halt
KHO initialization entirely?
Later, if KHO attempts to preserve a contiguous range of pages that spans
across this unreserved boundary, could kho_bootmem_overlap() incorrectly
evaluate the overlap and fail the preservation request?
> 0, MEMBLOCK_ALLOC_ACCESSIBLE,
> nid, true);
> if (!addr) {
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261014131547.259138-1-pratyush@kernel.org?part=1
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] kho: do not reserve empty per-node bootmem areas
2026-10-14 13:27 ` sashiko-bot
@ 2026-10-14 13:39 ` Pratyush Yadav
0 siblings, 0 replies; 3+ messages in thread
From: Pratyush Yadav @ 2026-10-14 13:39 UTC (permalink / raw)
To: sashiko-bot
Cc: Pratyush Yadav, Mike Rapoport, Pasha Tatashin, Alexander Graf,
sashiko-reviews, kexec, Bing Jiao
On Wed, Oct 14 2026, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [High] kho: incomplete fix for zero-size memblock allocations in bootmem
> --
>
> commit 67ab500bd948f5a3b52f1c8170626cb8f1dfc6c3
> Author: Pratyush Yadav (Google) <pratyush@kernel.org>
>
> kho: do not reserve empty per-node bootmem areas
>
> Some nodes do not allocate any early boot memory, causing memblock to
> return an address without reserving anything when requested with zero size.
> This address is recorded in kho_bootmem with a size of 0, and can cause KHO
> to fail to initialize. This patch skips bootmem reservation for memoryless
> nodes entirely.
>
>> diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c
>> index 7018e25e4eda1..6f1f55fe31819 100644
>> --- a/kernel/liveupdate/kexec_handover.c
>> +++ b/kernel/liveupdate/kexec_handover.c
>
> [ ... ]
>
>> @@ -882,6 +882,9 @@ static void __init kho_reserve_bootmem(void)
>> */
>> for_each_node_state(nid, N_MEMORY) {
>> size = bootmem_size_node(nid);
>> + if (!size)
>> + continue;
>> +
>> addr = memblock_alloc_range_nid(size, BOOTMEM_ALIGNMENT_BYTES,
>
> [Severity: High]
> This adds a zero-size check for per-node bootmem allocations, but does the
> same issue exist for bootmem_size_lowmem and bootmem_size_global?
Valid point, but that should be solved by the general bootmem sizing
patches being developed separately.
[...]
--
Regards,
Pratyush Yadav
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-14 13:39 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-14 13:15 [PATCH] kho: do not reserve empty per-node bootmem areas Pratyush Yadav
2026-10-14 13:27 ` sashiko-bot
2026-10-14 13:39 ` Pratyush Yadav
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox