From nobody Mon Apr 6 18:55:16 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 844A53A961A for ; Wed, 18 Mar 2026 09:26:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773825977; cv=none; b=Gj4xHFSKgtdselt4cYoKLJlJlbWYzVGXRDEtFjktyiGQnoknPck9zo4PFUFiGt2gJXDfa6L+0NDL6CYxVHg49luyohwlkmMb4vgCtxcvMGPiicM5HoXDReAX7NHAj1l243/yYRLGq/jwIf9AFiXURkWNGcWAQfl0ApqJBNlAR+0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773825977; c=relaxed/simple; bh=fXVwaxJFy/FUKV92sUZlFs6PgQI2aUlKi6Xw2EhXEac=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=s0loOoiKX7ocXA5gVl8DGy0u5GZ+nUPNjV7APnqFzNQ64phOHa8snbAuej5vqGoVSoacv5PKiArc5tG3uYGs76hmOl9OKZPSzWYKtL6ltHt3CPHvaJGzd+eqN3zF1uta1tnix0WYR5nzU74CFz5Q+ac17f+dWjpP/uVdAhECdOM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 89E961E7D; Wed, 18 Mar 2026 02:26:06 -0700 (PDT) Received: from e123572-lin.arm.com (e123572-lin.cambridge.arm.com [10.1.194.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id AF0883F73B; Wed, 18 Mar 2026 02:26:11 -0700 (PDT) From: Kevin Brodsky To: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org, Kevin Brodsky , "David Hildenbrand (Arm)" , Ryan Roberts , Catalin Marinas , Will Deacon Subject: [PATCH v2] arm64: mm: Use generic enum pgtable_level Date: Wed, 18 Mar 2026 09:25:43 +0000 Message-ID: <20260318092543.73331-1-kevin.brodsky@arm.com> X-Mailer: git-send-email 2.51.2 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" enum pgtable_type was introduced for arm64 by commit c64f46ee1377 ("arm64: mm: use enum to identify pgtable level instead of *_SHIFT"). In the meantime, the generic enum pgtable_level got introduced by commit b22cc9a9c7ff ("mm/rmap: convert "enum rmap_level" to "enum pgtable_level""). Let's switch to the generic enum pgtable_level. The only difference is that it also includes PGD level; __pgd_pgtable_alloc() isn't expected to create PGD tables so we add a VM_WARN_ON() for that case. Suggested-by: David Hildenbrand (Arm) Reviewed-by: David Hildenbrand (Arm) Reviewed-by: Ryan Roberts Signed-off-by: Kevin Brodsky Reviewed-by: Anshuman Khandual --- v1..v2: - Add a VM_WARN_ON() for PGD in __pgd_pgtable_alloc() [Ryan, David] Cc: Catalin Marinas Cc: Will Deacon --- arch/arm64/include/asm/mmu.h | 7 ----- arch/arm64/mm/mmu.c | 59 +++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 35 deletions(-) diff --git a/arch/arm64/include/asm/mmu.h b/arch/arm64/include/asm/mmu.h index 137a173df1ff..f28e6e215da4 100644 --- a/arch/arm64/include/asm/mmu.h +++ b/arch/arm64/include/asm/mmu.h @@ -17,13 +17,6 @@ #include #include =20 -enum pgtable_type { - TABLE_PTE, - TABLE_PMD, - TABLE_PUD, - TABLE_P4D, -}; - typedef struct { atomic64_t id; #ifdef CONFIG_COMPAT diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index a6a00accf4f9..c45a6a47dad0 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -112,7 +112,7 @@ pgprot_t phys_mem_access_prot(struct file *file, unsign= ed long pfn, } EXPORT_SYMBOL(phys_mem_access_prot); =20 -static phys_addr_t __init early_pgtable_alloc(enum pgtable_type pgtable_ty= pe) +static phys_addr_t __init early_pgtable_alloc(enum pgtable_level pgtable_l= evel) { phys_addr_t phys; =20 @@ -197,7 +197,7 @@ static void init_pte(pte_t *ptep, unsigned long addr, u= nsigned long end, static int alloc_init_cont_pte(pmd_t *pmdp, unsigned long addr, unsigned long end, phys_addr_t phys, pgprot_t prot, - phys_addr_t (*pgtable_alloc)(enum pgtable_type), + phys_addr_t (*pgtable_alloc)(enum pgtable_level), int flags) { unsigned long next; @@ -212,7 +212,7 @@ static int alloc_init_cont_pte(pmd_t *pmdp, unsigned lo= ng addr, if (flags & NO_EXEC_MAPPINGS) pmdval |=3D PMD_TABLE_PXN; BUG_ON(!pgtable_alloc); - pte_phys =3D pgtable_alloc(TABLE_PTE); + pte_phys =3D pgtable_alloc(PGTABLE_LEVEL_PTE); if (pte_phys =3D=3D INVALID_PHYS_ADDR) return -ENOMEM; ptep =3D pte_set_fixmap(pte_phys); @@ -252,7 +252,7 @@ static int alloc_init_cont_pte(pmd_t *pmdp, unsigned lo= ng addr, =20 static int init_pmd(pmd_t *pmdp, unsigned long addr, unsigned long end, phys_addr_t phys, pgprot_t prot, - phys_addr_t (*pgtable_alloc)(enum pgtable_type), int flags) + phys_addr_t (*pgtable_alloc)(enum pgtable_level), int flags) { unsigned long next; =20 @@ -292,7 +292,7 @@ static int init_pmd(pmd_t *pmdp, unsigned long addr, un= signed long end, static int alloc_init_cont_pmd(pud_t *pudp, unsigned long addr, unsigned long end, phys_addr_t phys, pgprot_t prot, - phys_addr_t (*pgtable_alloc)(enum pgtable_type), + phys_addr_t (*pgtable_alloc)(enum pgtable_level), int flags) { int ret; @@ -311,7 +311,7 @@ static int alloc_init_cont_pmd(pud_t *pudp, unsigned lo= ng addr, if (flags & NO_EXEC_MAPPINGS) pudval |=3D PUD_TABLE_PXN; BUG_ON(!pgtable_alloc); - pmd_phys =3D pgtable_alloc(TABLE_PMD); + pmd_phys =3D pgtable_alloc(PGTABLE_LEVEL_PMD); if (pmd_phys =3D=3D INVALID_PHYS_ADDR) return -ENOMEM; pmdp =3D pmd_set_fixmap(pmd_phys); @@ -349,7 +349,7 @@ static int alloc_init_cont_pmd(pud_t *pudp, unsigned lo= ng addr, =20 static int alloc_init_pud(p4d_t *p4dp, unsigned long addr, unsigned long e= nd, phys_addr_t phys, pgprot_t prot, - phys_addr_t (*pgtable_alloc)(enum pgtable_type), + phys_addr_t (*pgtable_alloc)(enum pgtable_level), int flags) { int ret =3D 0; @@ -364,7 +364,7 @@ static int alloc_init_pud(p4d_t *p4dp, unsigned long ad= dr, unsigned long end, if (flags & NO_EXEC_MAPPINGS) p4dval |=3D P4D_TABLE_PXN; BUG_ON(!pgtable_alloc); - pud_phys =3D pgtable_alloc(TABLE_PUD); + pud_phys =3D pgtable_alloc(PGTABLE_LEVEL_PUD); if (pud_phys =3D=3D INVALID_PHYS_ADDR) return -ENOMEM; pudp =3D pud_set_fixmap(pud_phys); @@ -415,7 +415,7 @@ static int alloc_init_pud(p4d_t *p4dp, unsigned long ad= dr, unsigned long end, =20 static int alloc_init_p4d(pgd_t *pgdp, unsigned long addr, unsigned long e= nd, phys_addr_t phys, pgprot_t prot, - phys_addr_t (*pgtable_alloc)(enum pgtable_type), + phys_addr_t (*pgtable_alloc)(enum pgtable_level), int flags) { int ret; @@ -430,7 +430,7 @@ static int alloc_init_p4d(pgd_t *pgdp, unsigned long ad= dr, unsigned long end, if (flags & NO_EXEC_MAPPINGS) pgdval |=3D PGD_TABLE_PXN; BUG_ON(!pgtable_alloc); - p4d_phys =3D pgtable_alloc(TABLE_P4D); + p4d_phys =3D pgtable_alloc(PGTABLE_LEVEL_P4D); if (p4d_phys =3D=3D INVALID_PHYS_ADDR) return -ENOMEM; p4dp =3D p4d_set_fixmap(p4d_phys); @@ -467,7 +467,7 @@ static int alloc_init_p4d(pgd_t *pgdp, unsigned long ad= dr, unsigned long end, static int __create_pgd_mapping_locked(pgd_t *pgdir, phys_addr_t phys, unsigned long virt, phys_addr_t size, pgprot_t prot, - phys_addr_t (*pgtable_alloc)(enum pgtable_type), + phys_addr_t (*pgtable_alloc)(enum pgtable_level), int flags) { int ret; @@ -500,7 +500,7 @@ static int __create_pgd_mapping_locked(pgd_t *pgdir, ph= ys_addr_t phys, static int __create_pgd_mapping(pgd_t *pgdir, phys_addr_t phys, unsigned long virt, phys_addr_t size, pgprot_t prot, - phys_addr_t (*pgtable_alloc)(enum pgtable_type), + phys_addr_t (*pgtable_alloc)(enum pgtable_level), int flags) { int ret; @@ -516,7 +516,7 @@ static int __create_pgd_mapping(pgd_t *pgdir, phys_addr= _t phys, static void early_create_pgd_mapping(pgd_t *pgdir, phys_addr_t phys, unsigned long virt, phys_addr_t size, pgprot_t prot, - phys_addr_t (*pgtable_alloc)(enum pgtable_type), + phys_addr_t (*pgtable_alloc)(enum pgtable_level), int flags) { int ret; @@ -528,7 +528,7 @@ static void early_create_pgd_mapping(pgd_t *pgdir, phys= _addr_t phys, } =20 static phys_addr_t __pgd_pgtable_alloc(struct mm_struct *mm, gfp_t gfp, - enum pgtable_type pgtable_type) + enum pgtable_level pgtable_level) { /* Page is zeroed by init_clear_pgtable() so don't duplicate effort. */ struct ptdesc *ptdesc =3D pagetable_alloc(gfp & ~__GFP_ZERO, 0); @@ -539,40 +539,43 @@ static phys_addr_t __pgd_pgtable_alloc(struct mm_stru= ct *mm, gfp_t gfp, =20 pa =3D page_to_phys(ptdesc_page(ptdesc)); =20 - switch (pgtable_type) { - case TABLE_PTE: + switch (pgtable_level) { + case PGTABLE_LEVEL_PTE: BUG_ON(!pagetable_pte_ctor(mm, ptdesc)); break; - case TABLE_PMD: + case PGTABLE_LEVEL_PMD: BUG_ON(!pagetable_pmd_ctor(mm, ptdesc)); break; - case TABLE_PUD: + case PGTABLE_LEVEL_PUD: pagetable_pud_ctor(ptdesc); break; - case TABLE_P4D: + case PGTABLE_LEVEL_P4D: pagetable_p4d_ctor(ptdesc); break; + case PGTABLE_LEVEL_PGD: + VM_WARN_ON(1); + break; } =20 return pa; } =20 static phys_addr_t -pgd_pgtable_alloc_init_mm_gfp(enum pgtable_type pgtable_type, gfp_t gfp) +pgd_pgtable_alloc_init_mm_gfp(enum pgtable_level pgtable_level, gfp_t gfp) { - return __pgd_pgtable_alloc(&init_mm, gfp, pgtable_type); + return __pgd_pgtable_alloc(&init_mm, gfp, pgtable_level); } =20 static phys_addr_t __maybe_unused -pgd_pgtable_alloc_init_mm(enum pgtable_type pgtable_type) +pgd_pgtable_alloc_init_mm(enum pgtable_level pgtable_level) { - return pgd_pgtable_alloc_init_mm_gfp(pgtable_type, GFP_PGTABLE_KERNEL); + return pgd_pgtable_alloc_init_mm_gfp(pgtable_level, GFP_PGTABLE_KERNEL); } =20 static phys_addr_t -pgd_pgtable_alloc_special_mm(enum pgtable_type pgtable_type) +pgd_pgtable_alloc_special_mm(enum pgtable_level pgtable_level) { - return __pgd_pgtable_alloc(NULL, GFP_PGTABLE_KERNEL, pgtable_type); + return __pgd_pgtable_alloc(NULL, GFP_PGTABLE_KERNEL, pgtable_level); } =20 static void split_contpte(pte_t *ptep) @@ -593,7 +596,7 @@ static int split_pmd(pmd_t *pmdp, pmd_t pmd, gfp_t gfp,= bool to_cont) pte_t *ptep; int i; =20 - pte_phys =3D pgd_pgtable_alloc_init_mm_gfp(TABLE_PTE, gfp); + pte_phys =3D pgd_pgtable_alloc_init_mm_gfp(PGTABLE_LEVEL_PTE, gfp); if (pte_phys =3D=3D INVALID_PHYS_ADDR) return -ENOMEM; ptep =3D (pte_t *)phys_to_virt(pte_phys); @@ -638,7 +641,7 @@ static int split_pud(pud_t *pudp, pud_t pud, gfp_t gfp,= bool to_cont) pmd_t *pmdp; int i; =20 - pmd_phys =3D pgd_pgtable_alloc_init_mm_gfp(TABLE_PMD, gfp); + pmd_phys =3D pgd_pgtable_alloc_init_mm_gfp(PGTABLE_LEVEL_PMD, gfp); if (pmd_phys =3D=3D INVALID_PHYS_ADDR) return -ENOMEM; pmdp =3D (pmd_t *)phys_to_virt(pmd_phys); @@ -1226,7 +1229,7 @@ static void __init declare_vma(struct vm_struct *vma, =20 static phys_addr_t kpti_ng_temp_alloc __initdata; =20 -static phys_addr_t __init kpti_ng_pgd_alloc(enum pgtable_type type) +static phys_addr_t __init kpti_ng_pgd_alloc(enum pgtable_level pgtable_lev= el) { kpti_ng_temp_alloc -=3D PAGE_SIZE; return kpti_ng_temp_alloc; --=20 2.51.2