Skip to content

Commit 20571b1

Browse files
prati0100akpm00
authored andcommitted
kho: move sanity checks to kho_restore_page()
While KHO exposes folio as the primitive externally, internally its restoration machinery operates on pages. This can be seen with kho_restore_folio() for example. It performs some sanity checks and hands it over to kho_restore_page() to do the heavy lifting of page restoration. After the work done by kho_restore_page(), kho_restore_folio() only converts the head page to folio and returns it. Similarly, deserialize_bitmap() operates on the head page directly to store the order. Move the sanity checks for valid phys and order from the public-facing kho_restore_folio() to the private-facing kho_restore_page(). This makes the boundary between page and folio clearer from KHO's perspective. While at it, drop the comment above kho_restore_page(). The comment is misleading now. The function stopped looking like free_reserved_page() since 12b9a2c ("kho: initialize tail pages for higher order folios properly"), and now looks even more different. Link: https://lkml.kernel.org/r/20250917125725.665-1-pratyush@kernel.org Signed-off-by: Pratyush Yadav <pratyush@kernel.org> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org> Cc: Alexander Graf <graf@amazon.com> Cc: Baoquan He <bhe@redhat.com> Cc: Changyuan Lyu <changyuanl@google.com> Cc: Chris Li <chrisl@kernel.org> Cc: Jason Gunthorpe <jgg@nvidia.com> Cc: Pasha Tatashin <pasha.tatashin@soleen.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 0389c30 commit 20571b1

1 file changed

Lines changed: 14 additions & 14 deletions

File tree

kernel/kexec_handover.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,18 @@ static int __kho_preserve_order(struct kho_mem_track *track, unsigned long pfn,
183183
return 0;
184184
}
185185

186-
/* almost as free_reserved_page(), just don't free the page */
187-
static void kho_restore_page(struct page *page, unsigned int order)
186+
static struct page *kho_restore_page(phys_addr_t phys)
188187
{
189-
unsigned int nr_pages = (1 << order);
188+
struct page *page = pfn_to_online_page(PHYS_PFN(phys));
189+
unsigned int nr_pages, order;
190+
191+
if (!page)
192+
return NULL;
193+
194+
order = page->private;
195+
if (order > MAX_PAGE_ORDER)
196+
return NULL;
197+
nr_pages = (1 << order);
190198

191199
/* Head page gets refcount of 1. */
192200
set_page_count(page, 1);
@@ -199,6 +207,7 @@ static void kho_restore_page(struct page *page, unsigned int order)
199207
prep_compound_page(page, order);
200208

201209
adjust_managed_page_count(page, nr_pages);
210+
return page;
202211
}
203212

204213
/**
@@ -209,18 +218,9 @@ static void kho_restore_page(struct page *page, unsigned int order)
209218
*/
210219
struct folio *kho_restore_folio(phys_addr_t phys)
211220
{
212-
struct page *page = pfn_to_online_page(PHYS_PFN(phys));
213-
unsigned long order;
214-
215-
if (!page)
216-
return NULL;
217-
218-
order = page->private;
219-
if (order > MAX_PAGE_ORDER)
220-
return NULL;
221+
struct page *page = kho_restore_page(phys);
221222

222-
kho_restore_page(page, order);
223-
return page_folio(page);
223+
return page ? page_folio(page) : NULL;
224224
}
225225
EXPORT_SYMBOL_GPL(kho_restore_folio);
226226

0 commit comments

Comments
 (0)