Hi Ran, On Tue, Jan 13 2026, [email protected] wrote:
> From: Ran Xiaokai <[email protected]> > > Memblock pages (including reserved memory) should have their allocation > tags initialized to CODETAG_EMPTY via clear_page_tag_ref() before being > released to the page allocator. When kho restores pages through > kho_restore_page(), missing this call causes mismatched > allocation/deallocation tracking and below warning message: > alloc_tag was not set > WARNING: include/linux/alloc_tag.h:164 at ___free_pages+0xb8/0x260, CPU#1: > swapper/0/1 > RIP: 0010:___free_pages+0xb8/0x260 > kho_restore_vmalloc+0x187/0x2e0 > kho_test_init+0x3c4/0xa30 > do_one_initcall+0x62/0x2b0 > kernel_init_freeable+0x25b/0x480 > kernel_init+0x1a/0x1c0 > ret_from_fork+0x2d1/0x360 > > Add missing clear_page_tag_ref() annotation in kho_restore_page() to > fix this. > > Fixes: fc33e4b44b27 ("kexec: enable KHO support for memory preservation") > Signed-off-by: Ran Xiaokai <[email protected]> > Reviewed-by: Mike Rapoport (Microsoft) <[email protected]> > Reviewed-by: Suren Baghdasaryan <[email protected]> > --- > kernel/liveupdate/kexec_handover.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/kernel/liveupdate/kexec_handover.c > b/kernel/liveupdate/kexec_handover.c > index cd6b3fb9dcae..2d47f2c50bd8 100644 > --- a/kernel/liveupdate/kexec_handover.c > +++ b/kernel/liveupdate/kexec_handover.c > @@ -268,6 +268,7 @@ static struct page *kho_restore_page(phys_addr_t phys, > bool is_folio) > else > kho_init_pages(page, nr_pages); > > + clear_page_tag_ref(page); You are only clearing the tag for the head page. The tail pages are still un-initialized. Is that intentional? What about non-compound pages (the ones you get from kho_restore_pages(), aka when is_folio is false)? Do we need to clear the tag on all pages in that case? > adjust_managed_page_count(page, nr_pages); > return page; > }
