From nobody Tue Apr 7 02:59:23 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E841039B94A for ; Mon, 16 Mar 2026 14:01:57 +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=1773669719; cv=none; b=l9KH05fEyK5L/bkjiVQXLSviAVVVacq/J0eaFPdlotsU7A6v8dgHTysSmDuklg5oqTVnL5TS7vSZWDWWfn2azuSYEJpgGWPcQYHi/EOwl7PzHhl7X6RT2ZUqIAdD2GD5swDdvQ//u1Vu/WY7nSCdOhrAvL9GxnrA3DZfKffOzbs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773669719; c=relaxed/simple; bh=i/FZvQIaE5+oyt65hUmzwbgYalN7ebxCKVhTtX59JBY=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=A6n5zhZBymMotJWG9gj3qe1xsBvEpymdubmJNQOWQzmOqPltOPlIpt6zNyV3KKNUF3VeBzuo6YCfDN02JQtwZcDewkZ0Y+vqompaScSy95hpE+fEAt8PX28MsZSrj8mEgx1/fQh2qI9SPTwTt4g1K4O4TwWWATCUplCG8fX6Ly0= 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 4E64F14BF; Mon, 16 Mar 2026 07:01:51 -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 787083F778; Mon, 16 Mar 2026 07:01:56 -0700 (PDT) From: Kevin Brodsky To: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org, Kevin Brodsky , "David Hildenbrand (Arm)" , Catalin Marinas , Ryan Roberts , Will Deacon Subject: [PATCH] arm64: mm: Use generic enum pgtable_level Date: Mon, 16 Mar 2026 14:01:50 +0000 Message-ID: <20260316140150.58207-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 - this isn't relevant in __pgd_pgtable_alloc() so we just add a default statement. Suggested-by: David Hildenbrand (Arm) Signed-off-by: Kevin Brodsky Reviewed-by: David Hildenbrand (Arm) Reviewed-by: Ryan Roberts --- Cc: Catalin Marinas Cc: Ryan Roberts Cc: Will Deacon --- arch/arm64/include/asm/mmu.h | 7 ----- arch/arm64/mm/mmu.c | 58 +++++++++++++++++++----------------- 2 files changed, 30 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..3a22e8f3c9fe 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,42 @@ 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; + default: + 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 +595,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 +640,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 +1228,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