Re: [PATCH v4 1/2] kho: Introduce a helper to init high order pages
Pranjal Shrivastava <[email protected]>
| Newsgroups | org.infradead.lists.kexec,org.kernel.vger.linux-kernel,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
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 <[email protected]> > > Signed-off-by: Pranjal Shrivastava <[email protected]> > > --- > > 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