On Fri, 05 Jun 2026 20:34:48 +0200, Pratyush Yadav <[email protected]> wrote:
> diff --git a/kernel/liveupdate/kexec_handover.c 
> b/kernel/liveupdate/kexec_handover.c
> index af22086ca2d6..8540608b8602 100644
> --- a/kernel/liveupdate/kexec_handover.c
> +++ b/kernel/liveupdate/kexec_handover.c
> @@ -869,6 +886,119 @@ static void __init kho_reserve_scratch(void)
>       kho_enable = false;
>  }
>  
> +#define KHO_EXT_SHIFT 30 /* 1 GiB */

Please add a comment why exactly 1 Gib.
I'd also define a size macro as SZ_1G and make shift const_ilog2(SIZE)

> +
> +static int __init kho_ext_walk_key(unsigned long key, void *data)

Maybe _leaf? No strong feelings though

> +{
> +     struct kho_radix_tree *tree = data;

Would be nice to say which tree in the variable name ;)

> [ ... skip 15 lines ... ]
> +     return 0;
> +}
> +
> +static int __init kho_ext_walk_node(phys_addr_t phys, void *data)
> +{
> +     struct kho_radix_tree *tree = data;

Ditto

> [ ... skip 15 lines ... ]
> +
> +     *prev_end = start + (1UL << KHO_EXT_SHIFT);
> +     return 0;
> +}
> +
> +/**

I don't think we expose statics as kernel-doc somewhere, so this
probably shouldn't be a kernel-doc comment

> + * kho_extend_scratch - Extend the scratch regions
> + *
> + * The KHO radix tree mixes both physical address and order into a single 
> key.

Here it's rather the preserved memory map radix tree or something like
that.

> + * This makes it hard to look for free ranges directly. This function first
> + * walks the radix tree and digests it down into another radix tree, whose 
> keys

Here as well, maybe don't even mention radix to make it shorter, the
important part is that we wakk the preserved memory map and create a
radix tree that identifies blocks around the preserved memory.

> + * identify blocks of KHO_EXT_SHIFT which contain preserved memory.
> + *
> + * Then it walks the digested radix tree and marks everything that doesn't 
> have
> + * preserved memory as scratch.
> + *
> + * NOTE: This function allocates memory so it should be called when scratch 
> has
> + * available space.
> + *
> + * NOTE: The pages of the KHO radix tree tables are not marked as preserved 
> in

^ preserved memory map radix tree :)

> + * the KHO tree. But they are expected to remain untouched until the tree is
> + * fully parsed. So this function also considers them to be "preserved 
> memory"
> + * and marks their blocks as busy.
> + */
> +static void __init kho_extend_scratch(void)
> +{
> +     const struct kho_radix_walk_cb kho_cb = {
> +             .leaf = kho_ext_walk_key,
> +             .node = kho_ext_walk_node,
> +     };
> +     const struct kho_radix_walk_cb ext_cb = {
> +             .leaf = kho_ext_mark_scratch,
> +     };
> +     struct kho_radix_tree radix;

sashiko says:

  Is it possible for the radix variable to contain uninitialized stack memory
  here?
  If radix is uninitialized, tree->root might contain garbage data when passed
  to kho_radix_init_tree()

and I agree :)

This should be

        struct kho_radix_tree radix = { 0 };

-- 
Sincerely yours,
Mike.


Reply via email to