]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
m68k: mm: Convert get_pointer_table() to use ptdescs
authorVishal Moola (Oracle) <vishal.moola@gmail.com>
Wed, 11 Jun 2025 00:12:52 +0000 (17:12 -0700)
committerGeert Uytterhoeven <geert@linux-m68k.org>
Mon, 30 Jun 2025 19:20:17 +0000 (21:20 +0200)
Motorola uses get_pointer_table() for page tables, so it should be using
struct ptdesc, not struct page.

This helps us prepare to allocate ptdescs as their own memory
descriptor, and prepares to remove a user of page->lru.

Signed-off-by: "Vishal Moola (Oracle)" <vishal.moola@gmail.com>
Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
Link: https://lore.kernel.org/20250611001255.527952-2-vishal.moola@gmail.com
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
arch/m68k/mm/motorola.c

index 745bd575dcfa61494e0ace5b78bffd509b08065e..8d54c1a7eaf58aa66e7352b859a6258ebdb92562 100644 (file)
@@ -148,40 +148,44 @@ void *get_pointer_table(struct mm_struct *mm, int type)
 
        /*
         * For a pointer table for a user process address space, a
-        * table is taken from a page allocated for the purpose.  Each
-        * page can hold 8 pointer tables.  The page is remapped in
+        * table is taken from a ptdesc allocated for the purpose.  Each
+        * ptdesc can hold 8 pointer tables.  The ptdesc is remapped in
         * virtual address space to be noncacheable.
         */
        if (mask == 0) {
-               void *page;
+               struct ptdesc *ptdesc;
                ptable_desc *new;
+               void *pt_addr;
 
-               if (!(page = (void *)get_zeroed_page(GFP_KERNEL)))
+               ptdesc = pagetable_alloc(GFP_KERNEL | __GFP_ZERO, 0);
+               if (!ptdesc)
                        return NULL;
 
+               pt_addr = ptdesc_address(ptdesc);
+
                switch (type) {
                case TABLE_PTE:
                        /*
                         * m68k doesn't have SPLIT_PTE_PTLOCKS for not having
                         * SMP.
                         */
-                       pagetable_pte_ctor(mm, virt_to_ptdesc(page));
+                       pagetable_pte_ctor(mm, ptdesc);
                        break;
                case TABLE_PMD:
-                       pagetable_pmd_ctor(mm, virt_to_ptdesc(page));
+                       pagetable_pmd_ctor(mm, ptdesc);
                        break;
                case TABLE_PGD:
-                       pagetable_pgd_ctor(virt_to_ptdesc(page));
+                       pagetable_pgd_ctor(ptdesc);
                        break;
                }
 
-               mmu_page_ctor(page);
+               mmu_page_ctor(pt_addr);
 
-               new = PD_PTABLE(page);
+               new = PD_PTABLE(pt_addr);
                PD_MARKBITS(new) = ptable_mask(type) - 1;
                list_add_tail(new, dp);
 
-               return (pmd_t *)page;
+               return (pmd_t *)pt_addr;
        }
 
        for (tmp = 1, off = 0; (mask & tmp) == 0; tmp <<= 1, off += ptable_size(type))
@@ -191,7 +195,7 @@ void *get_pointer_table(struct mm_struct *mm, int type)
                /* move to end of list */
                list_move_tail(dp, &ptable_list[type]);
        }
-       return page_address(PD_PAGE(dp)) + off;
+       return ptdesc_address(PD_PTDESC(dp)) + off;
 }
 
 int free_pointer_table(void *table, int type)