Thread (26 messages) 26 messages, 5 authors, 2025-01-06

Re: [PATCH v3 02/17] riscv: mm: Skip pgtable level check in {pud,p4d}_alloc_one

From: Qi Zheng <hidden>
Date: 2024-12-28 06:36:32
Also in: linux-arch, linux-arm-kernel, linux-m68k, linux-mips, linux-mm, linux-riscv, linux-s390, linux-sh, linux-um, lkml, loongarch, sparclinux

Hi Palmer,

On 2024/12/28 00:40, Palmer Dabbelt wrote:
On Mon, 23 Dec 2024 01:40:48 PST (-0800), zhengqi.arch@bytedance.com wrote:
quoted
From: Kevin Brodsky <redacted>

{pmd,pud,p4d}_alloc_one() is never called if the corresponding page
table level is folded, as {pmd,pud,p4d}_alloc() already does the
required check. We can therefore remove the runtime page table level
checks in {pud,p4d}_alloc_one. The PUD helper becomes equivalent to
the generic version, so we remove it altogether.

This is consistent with the way arm64 and x86 handle this situation
(runtime check in p4d_free() only).

Signed-off-by: Kevin Brodsky <redacted>
Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
Signed-off-by: Qi Zheng <redacted>
---
 arch/riscv/include/asm/pgalloc.h | 22 ++++------------------
 1 file changed, 4 insertions(+), 18 deletions(-)
diff --git a/arch/riscv/include/asm/pgalloc.h 
b/arch/riscv/include/asm/pgalloc.h
index f52264304f772..8ad0bbe838a24 100644
--- a/arch/riscv/include/asm/pgalloc.h
+++ b/arch/riscv/include/asm/pgalloc.h
@@ -12,7 +12,6 @@
 #include <asm/tlb.h>

 #ifdef CONFIG_MMU
-#define __HAVE_ARCH_PUD_ALLOC_ONE
 #define __HAVE_ARCH_PUD_FREE
 #include <asm-generic/pgalloc.h>
@@ -88,15 +87,6 @@ static inline void pgd_populate_safe(struct 
mm_struct *mm, pgd_t *pgd,
     }
 }

-#define pud_alloc_one pud_alloc_one
-static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned 
long addr)
-{
-    if (pgtable_l4_enabled)
-        return __pud_alloc_one(mm, addr);
-
-    return NULL;
-}
-
 #define pud_free pud_free
 static inline void pud_free(struct mm_struct *mm, pud_t *pud)
 {
@@ -118,15 +108,11 @@ static inline void __pud_free_tlb(struct 
mmu_gather *tlb, pud_t *pud,
 #define p4d_alloc_one p4d_alloc_one
 static inline p4d_t *p4d_alloc_one(struct mm_struct *mm, unsigned 
long addr)
 {
-    if (pgtable_l5_enabled) {
-        gfp_t gfp = GFP_PGTABLE_USER;
-
-        if (mm == &init_mm)
-            gfp = GFP_PGTABLE_KERNEL;
-        return (p4d_t *)get_zeroed_page(gfp);
-    }
+    gfp_t gfp = GFP_PGTABLE_USER;

-    return NULL;
+    if (mm == &init_mm)
+        gfp = GFP_PGTABLE_KERNEL;
+    return (p4d_t *)get_zeroed_page(gfp);
 }

 static inline void __p4d_free(struct mm_struct *mm, p4d_t *p4d)
Acked-by: Palmer Dabbelt <redacted>
Thank you for reviewing the patch!
Are you trying to keep these together, or do you want me to try and pick 
up the RISC-V bits on their own?
I prefer to keep them together because later patches depend on this one.
And this patch series has been merged into mm-unstable branch.

Thanks!

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help