Commit e751303e authored by Vishal Moola (Oracle)'s avatar Vishal Moola (Oracle) Committed by Dave Hansen
Browse files

x86/mm/pat: Convert split_large_page() to use ptdescs



Use the ptdesc APIs for all page table allocation and free sites to
allow their separate allocation from struct page in the future.

Update split_large_page() to allocate a ptdesc instead of allocating a
page for use as a page table.

Signed-off-by: default avatarVishal Moola (Oracle) <vishal.moola@gmail.com>
Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
Acked-by: default avatarMike Rapoport (Microsoft) <rppt@kernel.org>
Link: https://patch.msgid.link/20260303194828.1406905-5-vishal.moola@gmail.com
parent b2203a9b
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -1119,9 +1119,10 @@ static void split_set_pte(struct cpa_data *cpa, pte_t *pte, unsigned long pfn,

static int
__split_large_page(struct cpa_data *cpa, pte_t *kpte, unsigned long address,
		   struct page *base)
		   struct ptdesc *ptdesc)
{
	unsigned long lpaddr, lpinc, ref_pfn, pfn, pfninc = 1;
	struct page *base = ptdesc_page(ptdesc);
	pte_t *pbase = (pte_t *)page_address(base);
	unsigned int i, level;
	pgprot_t ref_prot;
@@ -1226,18 +1227,18 @@ __split_large_page(struct cpa_data *cpa, pte_t *kpte, unsigned long address,
static int split_large_page(struct cpa_data *cpa, pte_t *kpte,
			    unsigned long address)
{
	struct page *base;
	struct ptdesc *ptdesc;

	if (!debug_pagealloc_enabled())
		spin_unlock(&cpa_lock);
	base = alloc_pages(GFP_KERNEL, 0);
	ptdesc = pagetable_alloc(GFP_KERNEL, 0);
	if (!debug_pagealloc_enabled())
		spin_lock(&cpa_lock);
	if (!base)
	if (!ptdesc)
		return -ENOMEM;

	if (__split_large_page(cpa, kpte, address, base))
		__free_page(base);
	if (__split_large_page(cpa, kpte, address, ptdesc))
		pagetable_free(ptdesc);

	return 0;
}