Re: [PATCH v4 1/2] kho: Introduce a helper to init high order pages
From: Pranjal Shrivastava
Date: Wed Aug 12 2026 - 08:34:22 EST
On Wed, Aug 12, 2026 at 12:54:45PM +0200, Pratyush Yadav wrote:
> On Mon, Aug 03 2026, Pranjal Shrivastava wrote:
>
> > The current KHO restoration logic assumes all multi-page blocks are
> > split into independent 4KB pages. Break out a helper to prepare for
> > supporting high-order non-compound pages.
> >
> > Extract kho_init_high_order_page() to handle the refcount pattern
> > where only the head page is refcounted. Use the helper for folio
> > restoration that requires a similar refcount logic.
> >
> > Reviewed-by: Samiullah Khawaja <skhawaja@xxxxxxxxxx>
> > Signed-off-by: Pranjal Shrivastava <praan@xxxxxxxxxx>
> > ---
> > kernel/liveupdate/kexec_handover.c | 29 +++++++++++++++++++----------
> > 1 file changed, 19 insertions(+), 10 deletions(-)
> >
> > diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c
> > index 4834a809985a..e836efd98795 100644
> > --- a/kernel/liveupdate/kexec_handover.c
> > +++ b/kernel/liveupdate/kexec_handover.c
> > @@ -357,6 +357,24 @@ int kho_radix_walk_tree(struct kho_radix_tree *tree,
> > }
> > EXPORT_SYMBOL_GPL(kho_radix_walk_tree);
> >
> > +/* For physically contiguous pages. */
> > +static void kho_init_high_order_page(struct page *page, unsigned int order)
> > +{
> > + unsigned long nr_pages = (1UL << order);
> > +
> > + /* Head page gets refcount of 1. */
> > + set_page_count(page, 1);
> > + /* Clear head page's codetag to avoid accounting mismatch. */
> > + clear_page_tag_ref(page);
> > +
> > + /* For high-order blocks, tail pages get a page count of zero. */
> > + for (unsigned long i = 1; i < nr_pages; i++) {
> > + set_page_count(page + i, 0);
> > + /* Clear each page's codetag to avoid accounting mismatch. */
> > + clear_page_tag_ref(page + i);
> > + }
>
> That's sneaky...
>
> The patch _almost_ looks like pure code movement, but then adds this
> little change. I'm not saying this is intentionally sneaky or anything
> of the sort, but these kind of things are easy to miss during code
> movement and should get a patch of their own or at least be called out
> in the commit message.
>
> I don't know how page tags work, but IIRC when the change was originally
> added by Ran, he said that we don't need to clear the tag for tail
> pages. That held true for folios, does it not hold true for non-compound
> high-order pages?
>
Hmm.. I added it here because I saw pgalloc_tag_add(..., 1 << order, ..);
being called in the post_alloc_hook [1] but digging deeper I see it
doesn't set a tag_ref on the tail pages for non-compound high-order
pages (i.e. it doesn't loop over 1 << order pages) [2]
We seem to clear tag refs which shouldn't be set in the first place,
I'll remove the clear_page_tag_ref(page + i); in the tail loop.
Thanks,
Praan
[1] https://elixir.bootlin.com/linux/v7.2-rc3/source/mm/page_alloc.c#L1861
[2] https://elixir.bootlin.com/linux/v7.2-rc3/source/mm/page_alloc.c#L1255