]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/mm/pat: Convert split_large_page() to use ptdescs
authorVishal Moola (Oracle) <vishal.moola@gmail.com>
Tue, 3 Mar 2026 19:48:27 +0000 (11:48 -0800)
committerDave Hansen <dave.hansen@linux.intel.com>
Wed, 4 Mar 2026 18:08:54 +0000 (10:08 -0800)
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: Vishal Moola (Oracle) <vishal.moola@gmail.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Link: https://patch.msgid.link/20260303194828.1406905-5-vishal.moola@gmail.com
arch/x86/mm/pat/set_memory.c

index 17c1c28e34912d2566007bc55eedf82f3cd43bec..cba907c397186866d106a2b5442c28db52798350 100644 (file)
@@ -1119,9 +1119,10 @@ set:
 
 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;
 }