* [PATCH 0/2] kho: fixes for vmalloc restoration @ 2025-11-25 11:09 Mike Rapoport 2025-11-25 11:09 ` [PATCH 1/2] kho: kho_restore_vmalloc: fix initialization of pages array Mike Rapoport 2025-11-25 11:09 ` [PATCH 2/2] kho: fix restoring of contiguous ranges of order-0 pages Mike Rapoport 0 siblings, 2 replies; 7+ messages in thread From: Mike Rapoport @ 2025-11-25 11:09 UTC (permalink / raw) To: Andrew Morton Cc: Alexander Graf, Mike Rapoport, Pasha Tatashin, Pratyush Yadav, kexec, linux-mm, linux-kernel From: "Mike Rapoport (Microsoft)" <rppt@kernel.org> Hi, Pratyush reported off-list that when kho_restore_vmalloc() is used to restore a vmalloc_huge() allocation it hits VM_BUG_ON() when we reconstruct the struct pages in kho_restore_pages(). These patches fix the issue. Mike Rapoport (Microsoft) (2): kho: kho_restore_vmalloc: fix initialization of pages array kho: fix restoring of contiguous ranges of order-0 pages kernel/liveupdate/kexec_handover.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) -- 2.50.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/2] kho: kho_restore_vmalloc: fix initialization of pages array 2025-11-25 11:09 [PATCH 0/2] kho: fixes for vmalloc restoration Mike Rapoport @ 2025-11-25 11:09 ` Mike Rapoport 2025-11-25 13:18 ` Pratyush Yadav 2025-11-25 11:09 ` [PATCH 2/2] kho: fix restoring of contiguous ranges of order-0 pages Mike Rapoport 1 sibling, 1 reply; 7+ messages in thread From: Mike Rapoport @ 2025-11-25 11:09 UTC (permalink / raw) To: Andrew Morton Cc: Alexander Graf, Mike Rapoport, Pasha Tatashin, Pratyush Yadav, kexec, linux-mm, linux-kernel From: "Mike Rapoport (Microsoft)" <rppt@kernel.org> In case a preserved vmalloc allocation was using huge pages, all pages in the array of pages added to vm_struct during kho_restore_vmalloc() are wrongly set to the same page. Fix the indexing when assigning pages to that array. Fixes: a667300bd53f ("kho: add support for preserving vmalloc allocations") Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org> --- kernel/liveupdate/kexec_handover.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c index 5809c6fe331c..e64ee87fa62a 100644 --- a/kernel/liveupdate/kexec_handover.c +++ b/kernel/liveupdate/kexec_handover.c @@ -1096,7 +1096,7 @@ void *kho_restore_vmalloc(const struct kho_vmalloc *preservation) goto err_free_pages_array; for (int j = 0; j < contig_pages; j++) - pages[idx++] = page; + pages[idx++] = page + j; phys += contig_pages * PAGE_SIZE; } -- 2.50.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] kho: kho_restore_vmalloc: fix initialization of pages array 2025-11-25 11:09 ` [PATCH 1/2] kho: kho_restore_vmalloc: fix initialization of pages array Mike Rapoport @ 2025-11-25 13:18 ` Pratyush Yadav 0 siblings, 0 replies; 7+ messages in thread From: Pratyush Yadav @ 2025-11-25 13:18 UTC (permalink / raw) To: Mike Rapoport Cc: Andrew Morton, Alexander Graf, Pasha Tatashin, Pratyush Yadav, kexec, linux-mm, linux-kernel On Tue, Nov 25 2025, Mike Rapoport wrote: > From: "Mike Rapoport (Microsoft)" <rppt@kernel.org> > > In case a preserved vmalloc allocation was using huge pages, all pages in > the array of pages added to vm_struct during kho_restore_vmalloc() are > wrongly set to the same page. > > Fix the indexing when assigning pages to that array. > > Fixes: a667300bd53f ("kho: add support for preserving vmalloc allocations") > Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org> Reviewed-by: Pratyush Yadav <pratyush@kernel.org> [...] -- Regards, Pratyush Yadav ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/2] kho: fix restoring of contiguous ranges of order-0 pages 2025-11-25 11:09 [PATCH 0/2] kho: fixes for vmalloc restoration Mike Rapoport 2025-11-25 11:09 ` [PATCH 1/2] kho: kho_restore_vmalloc: fix initialization of pages array Mike Rapoport @ 2025-11-25 11:09 ` Mike Rapoport 2025-11-25 13:45 ` Pratyush Yadav 1 sibling, 1 reply; 7+ messages in thread From: Mike Rapoport @ 2025-11-25 11:09 UTC (permalink / raw) To: Andrew Morton Cc: Alexander Graf, Mike Rapoport, Pasha Tatashin, Pratyush Yadav, kexec, linux-mm, linux-kernel From: "Mike Rapoport (Microsoft)" <rppt@kernel.org> When contiguous ranges of order-0 pages are restored, kho_restore_page() calls prep_compound_page() with the first page in the range and order as parameters and then kho_restore_pages() calls split_page() to make sure all pages in the range are order-0. However, since split_page() is not intended to split compound pages and with VM_DEBUG enabled it will trigger a VM_BUG_ON_PAGE(). Update kho_restore_page() so that it will use prep_compound_page() when it restores a folio and make sure it properly sets page count for both large folios and ranges of order-0 pages. Reported-by: Pratyush Yadav <pratyush@kernel.org> Fixes: a667300bd53f ("kho: add support for preserving vmalloc allocations") Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org> --- kernel/liveupdate/kexec_handover.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c index e64ee87fa62a..61d17ed1f423 100644 --- a/kernel/liveupdate/kexec_handover.c +++ b/kernel/liveupdate/kexec_handover.c @@ -219,11 +219,11 @@ static int __kho_preserve_order(struct kho_mem_track *track, unsigned long pfn, return 0; } -static struct page *kho_restore_page(phys_addr_t phys) +static struct page *kho_restore_page(phys_addr_t phys, bool is_folio) { struct page *page = pfn_to_online_page(PHYS_PFN(phys)); + unsigned int nr_pages, ref_cnt; union kho_page_info info; - unsigned int nr_pages; if (!page) return NULL; @@ -243,11 +243,16 @@ static struct page *kho_restore_page(phys_addr_t phys) /* Head page gets refcount of 1. */ set_page_count(page, 1); - /* For higher order folios, tail pages get a page count of zero. */ + /* + * For higher order folios, tail pages get a page count of zero. + * For physically contiguous order-0 pages every pages gets a page + * count of 1 + */ + ref_cnt = is_folio ? 0 : 1; for (unsigned int i = 1; i < nr_pages; i++) - set_page_count(page + i, 0); + set_page_count(page + i, ref_cnt); - if (info.order > 0) + if (is_folio && info.order) prep_compound_page(page, info.order); adjust_managed_page_count(page, nr_pages); @@ -262,7 +267,7 @@ static struct page *kho_restore_page(phys_addr_t phys) */ struct folio *kho_restore_folio(phys_addr_t phys) { - struct page *page = kho_restore_page(phys); + struct page *page = kho_restore_page(phys, true); return page ? page_folio(page) : NULL; } @@ -287,11 +292,10 @@ struct page *kho_restore_pages(phys_addr_t phys, unsigned int nr_pages) while (pfn < end_pfn) { const unsigned int order = min(count_trailing_zeros(pfn), ilog2(end_pfn - pfn)); - struct page *page = kho_restore_page(PFN_PHYS(pfn)); + struct page *page = kho_restore_page(PFN_PHYS(pfn), false); if (!page) return NULL; - split_page(page, order); pfn += 1 << order; } -- 2.50.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] kho: fix restoring of contiguous ranges of order-0 pages 2025-11-25 11:09 ` [PATCH 2/2] kho: fix restoring of contiguous ranges of order-0 pages Mike Rapoport @ 2025-11-25 13:45 ` Pratyush Yadav 2025-12-01 6:54 ` Mike Rapoport 0 siblings, 1 reply; 7+ messages in thread From: Pratyush Yadav @ 2025-11-25 13:45 UTC (permalink / raw) To: Mike Rapoport Cc: Andrew Morton, Alexander Graf, Pasha Tatashin, Pratyush Yadav, kexec, linux-mm, linux-kernel On Tue, Nov 25 2025, Mike Rapoport wrote: > From: "Mike Rapoport (Microsoft)" <rppt@kernel.org> > > When contiguous ranges of order-0 pages are restored, kho_restore_page() > calls prep_compound_page() with the first page in the range and order as > parameters and then kho_restore_pages() calls split_page() to make sure all > pages in the range are order-0. > > However, since split_page() is not intended to split compound pages and > with VM_DEBUG enabled it will trigger a VM_BUG_ON_PAGE(). > > Update kho_restore_page() so that it will use prep_compound_page() when it > restores a folio and make sure it properly sets page count for both large > folios and ranges of order-0 pages. > > Reported-by: Pratyush Yadav <pratyush@kernel.org> > Fixes: a667300bd53f ("kho: add support for preserving vmalloc allocations") > Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org> > --- > kernel/liveupdate/kexec_handover.c | 20 ++++++++++++-------- > 1 file changed, 12 insertions(+), 8 deletions(-) > > diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c > index e64ee87fa62a..61d17ed1f423 100644 > --- a/kernel/liveupdate/kexec_handover.c > +++ b/kernel/liveupdate/kexec_handover.c > @@ -219,11 +219,11 @@ static int __kho_preserve_order(struct kho_mem_track *track, unsigned long pfn, > return 0; > } > > -static struct page *kho_restore_page(phys_addr_t phys) > +static struct page *kho_restore_page(phys_addr_t phys, bool is_folio) > { > struct page *page = pfn_to_online_page(PHYS_PFN(phys)); > + unsigned int nr_pages, ref_cnt; > union kho_page_info info; > - unsigned int nr_pages; > > if (!page) > return NULL; > @@ -243,11 +243,16 @@ static struct page *kho_restore_page(phys_addr_t phys) > /* Head page gets refcount of 1. */ > set_page_count(page, 1); > > - /* For higher order folios, tail pages get a page count of zero. */ > + /* > + * For higher order folios, tail pages get a page count of zero. > + * For physically contiguous order-0 pages every pages gets a page > + * count of 1 > + */ > + ref_cnt = is_folio ? 0 : 1; > for (unsigned int i = 1; i < nr_pages; i++) > - set_page_count(page + i, 0); > + set_page_count(page + i, ref_cnt); > > - if (info.order > 0) > + if (is_folio && info.order) This is getting a bit difficult to parse. Let's separate out folio and page initialization to separate helpers: /* Initalize 0-order KHO pages */ static void kho_init_page(struct page *page, unsigned int nr_pages) { for (unsigned int i = 0; i < nr_pages; i++) set_page_count(page + i, 1); } static void kho_init_folio(struct page *page, unsigned int order) { unsigned int nr_pages = (1 << order); /* Head page gets refcount of 1. */ set_page_count(page, 1); /* For higher order folios, tail pages get a page count of zero. */ for (unsigned int i = 1; i < nr_pages; i++) set_page_count(page + i, 0); if (order > 0) prep_compound_page(page, order); } > prep_compound_page(page, info.order); > > adjust_managed_page_count(page, nr_pages); > @@ -262,7 +267,7 @@ static struct page *kho_restore_page(phys_addr_t phys) > */ > struct folio *kho_restore_folio(phys_addr_t phys) > { > - struct page *page = kho_restore_page(phys); > + struct page *page = kho_restore_page(phys, true); > > return page ? page_folio(page) : NULL; > } > @@ -287,11 +292,10 @@ struct page *kho_restore_pages(phys_addr_t phys, unsigned int nr_pages) > while (pfn < end_pfn) { > const unsigned int order = > min(count_trailing_zeros(pfn), ilog2(end_pfn - pfn)); > - struct page *page = kho_restore_page(PFN_PHYS(pfn)); > + struct page *page = kho_restore_page(PFN_PHYS(pfn), false); > > if (!page) > return NULL; > - split_page(page, order); > pfn += 1 << order; > } -- Regards, Pratyush Yadav ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] kho: fix restoring of contiguous ranges of order-0 pages 2025-11-25 13:45 ` Pratyush Yadav @ 2025-12-01 6:54 ` Mike Rapoport 2025-12-01 13:23 ` Pratyush Yadav 0 siblings, 1 reply; 7+ messages in thread From: Mike Rapoport @ 2025-12-01 6:54 UTC (permalink / raw) To: Pratyush Yadav Cc: Andrew Morton, Alexander Graf, Pasha Tatashin, kexec, linux-mm, linux-kernel Hi Pratyush, On Tue, Nov 25, 2025 at 02:45:59PM +0100, Pratyush Yadav wrote: > On Tue, Nov 25 2025, Mike Rapoport wrote: ... > > @@ -243,11 +243,16 @@ static struct page *kho_restore_page(phys_addr_t phys) > > /* Head page gets refcount of 1. */ > > set_page_count(page, 1); > > > > - /* For higher order folios, tail pages get a page count of zero. */ > > + /* > > + * For higher order folios, tail pages get a page count of zero. > > + * For physically contiguous order-0 pages every pages gets a page > > + * count of 1 > > + */ > > + ref_cnt = is_folio ? 0 : 1; > > for (unsigned int i = 1; i < nr_pages; i++) > > - set_page_count(page + i, 0); > > + set_page_count(page + i, ref_cnt); > > > > - if (info.order > 0) > > + if (is_folio && info.order) > > This is getting a bit difficult to parse. Let's separate out folio and > page initialization to separate helpers: Sorry, I've missed this earlier and now the patches are in akpm's -stable branch. Let's postpone these changes for the next cycle, maybe along with support for deferred initialization of struct page. > /* Initalize 0-order KHO pages */ > static void kho_init_page(struct page *page, unsigned int nr_pages) > { > for (unsigned int i = 0; i < nr_pages; i++) > set_page_count(page + i, 1); > } > > static void kho_init_folio(struct page *page, unsigned int order) > { > unsigned int nr_pages = (1 << order); > > /* Head page gets refcount of 1. */ > set_page_count(page, 1); > > /* For higher order folios, tail pages get a page count of zero. */ > for (unsigned int i = 1; i < nr_pages; i++) > set_page_count(page + i, 0); > > if (order > 0) > prep_compound_page(page, order); > } -- Sincerely yours, Mike. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] kho: fix restoring of contiguous ranges of order-0 pages 2025-12-01 6:54 ` Mike Rapoport @ 2025-12-01 13:23 ` Pratyush Yadav 0 siblings, 0 replies; 7+ messages in thread From: Pratyush Yadav @ 2025-12-01 13:23 UTC (permalink / raw) To: Mike Rapoport Cc: Pratyush Yadav, Andrew Morton, Alexander Graf, Pasha Tatashin, kexec, linux-mm, linux-kernel On Mon, Dec 01 2025, Mike Rapoport wrote: > Hi Pratyush, > > On Tue, Nov 25, 2025 at 02:45:59PM +0100, Pratyush Yadav wrote: >> On Tue, Nov 25 2025, Mike Rapoport wrote: > > ... > >> > @@ -243,11 +243,16 @@ static struct page *kho_restore_page(phys_addr_t phys) >> > /* Head page gets refcount of 1. */ >> > set_page_count(page, 1); >> > >> > - /* For higher order folios, tail pages get a page count of zero. */ >> > + /* >> > + * For higher order folios, tail pages get a page count of zero. >> > + * For physically contiguous order-0 pages every pages gets a page >> > + * count of 1 >> > + */ >> > + ref_cnt = is_folio ? 0 : 1; >> > for (unsigned int i = 1; i < nr_pages; i++) >> > - set_page_count(page + i, 0); >> > + set_page_count(page + i, ref_cnt); >> > >> > - if (info.order > 0) >> > + if (is_folio && info.order) >> >> This is getting a bit difficult to parse. Let's separate out folio and >> page initialization to separate helpers: > > Sorry, I've missed this earlier and now the patches are in akpm's -stable > branch. > Let's postpone these changes for the next cycle, maybe along with support > for deferred initialization of struct page. Sure, no problem. [...] -- Regards, Pratyush Yadav ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-12-01 13:23 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-11-25 11:09 [PATCH 0/2] kho: fixes for vmalloc restoration Mike Rapoport 2025-11-25 11:09 ` [PATCH 1/2] kho: kho_restore_vmalloc: fix initialization of pages array Mike Rapoport 2025-11-25 13:18 ` Pratyush Yadav 2025-11-25 11:09 ` [PATCH 2/2] kho: fix restoring of contiguous ranges of order-0 pages Mike Rapoport 2025-11-25 13:45 ` Pratyush Yadav 2025-12-01 6:54 ` Mike Rapoport 2025-12-01 13:23 ` Pratyush Yadav
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox