Re: [RFC PATCH v2 2/2] kho: Introduce preserve/restore APIs for unsplit pages
From: Pranjal Shrivastava
Date: Wed Jul 22 2026 - 17:20:33 EST
On Mon, Jul 20, 2026 at 07:57:15PM +0300, Mike Rapoport wrote:
> > The current KHO page preservation APIs (e.g. kho_preserve_pages) assume
> > that multi-page blocks are split into independent 4KB pages during
> > restoration. This is incompatible with high-order non-compound pages,
> > such as DMA buffers, which must be restored with tail pages having a
> > zero reference count.
> >
> > Introduce explicit preserve and restore APIs for unsplit pages,
>
> high-order non-compound ^
>
Ack, will update the commit msg.
> > which preserve and restore a high-order page block as a single unit,
> > applying a refcount of 1 to the head page while leaving tail pages at 0.
> > Rename the existing internal helper to __kho_restore_page().
> >
> > Signed-off-by: Pranjal Shrivastava <praan@xxxxxxxxxx>
> >
> > diff --git a/include/linux/kexec_handover.h b/include/linux/kexec_handover.h
> > index 8968c56d2d73e..6e2c75b16209c 100644
> > --- a/include/linux/kexec_handover.h
> > +++ b/include/linux/kexec_handover.h
> > @@ -22,6 +22,8 @@ bool is_kho_boot(void);
> >
[...]
> > +struct page *kho_restore_page(phys_addr_t phys)
> > +{
> > + struct page *page = pfn_to_online_page(PHYS_PFN(phys));
> > + unsigned long nr_pages;
> > + union kho_page_info info;
> > +
> > + if (!page)
> > + return NULL;
> > +
> > + info.page_private = page->private;
> > + if (WARN_ON_ONCE(info.magic != KHO_PAGE_MAGIC))
> > + return NULL;
> > +
> > + nr_pages = (1UL << info.order);
> > + page->private = 0;
> > +
> > + kho_init_unsplit_pages(page, info.order);
> > + adjust_managed_page_count(page, nr_pages);
> > +
> > + return page;
>
> Hmm, it copies a lot from __kho_init_page().
> We should keep the common part of order-0 page/folio/high-order page
> initialization in a single place.
>
Alright, I'll break out a helper.
Thanks,
Praan