return 0;
}
-/* almost as free_reserved_page(), just don't free the page */
-static void kho_restore_page(struct page *page, unsigned int order)
+static struct page *kho_restore_page(phys_addr_t phys)
{
- unsigned int nr_pages = (1 << order);
+ struct page *page = pfn_to_online_page(PHYS_PFN(phys));
+ unsigned int nr_pages, order;
+
+ if (!page)
+ return NULL;
+
+ order = page->private;
+ if (order > MAX_PAGE_ORDER)
+ return NULL;
+ nr_pages = (1 << order);
/* Head page gets refcount of 1. */
set_page_count(page, 1);
prep_compound_page(page, order);
adjust_managed_page_count(page, nr_pages);
+ return page;
}
/**
*/
struct folio *kho_restore_folio(phys_addr_t phys)
{
- struct page *page = pfn_to_online_page(PHYS_PFN(phys));
- unsigned long order;
-
- if (!page)
- return NULL;
-
- order = page->private;
- if (order > MAX_PAGE_ORDER)
- return NULL;
+ struct page *page = kho_restore_page(phys);
- kho_restore_page(page, order);
- return page_folio(page);
+ return page ? page_folio(page) : NULL;
}
EXPORT_SYMBOL_GPL(kho_restore_folio);