| From 10472e2527c0bb2430184fdab3cb7b75cc98e185 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 22 Apr 2022 14:00:33 +0800 |
| Subject: arm64: mm: fix p?d_leaf() |
| |
| From: Muchun Song <songmuchun@bytedance.com> |
| |
| [ Upstream commit 23bc8f69f0eceecbb87c3801d2e48827d2dca92b ] |
| |
| The pmd_leaf() is used to test a leaf mapped PMD, however, it misses |
| the PROT_NONE mapped PMD on arm64. Fix it. A real world issue [1] |
| caused by this was reported by Qian Cai. Also fix pud_leaf(). |
| |
| Link: https://patchwork.kernel.org/comment/24798260/ [1] |
| Fixes: 8aa82df3c123 ("arm64: mm: add p?d_leaf() definitions") |
| Reported-by: Qian Cai <quic_qiancai@quicinc.com> |
| Signed-off-by: Muchun Song <songmuchun@bytedance.com> |
| Link: https://lore.kernel.org/r/20220422060033.48711-1-songmuchun@bytedance.com |
| Signed-off-by: Will Deacon <will@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/arm64/include/asm/pgtable.h | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h |
| index 9cf8e304bb56..3f74db7b0a31 100644 |
| --- a/arch/arm64/include/asm/pgtable.h |
| +++ b/arch/arm64/include/asm/pgtable.h |
| @@ -516,7 +516,7 @@ extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, |
| PMD_TYPE_TABLE) |
| #define pmd_sect(pmd) ((pmd_val(pmd) & PMD_TYPE_MASK) == \ |
| PMD_TYPE_SECT) |
| -#define pmd_leaf(pmd) pmd_sect(pmd) |
| +#define pmd_leaf(pmd) (pmd_present(pmd) && !pmd_table(pmd)) |
| #define pmd_bad(pmd) (!pmd_table(pmd)) |
| |
| #if defined(CONFIG_ARM64_64K_PAGES) || CONFIG_PGTABLE_LEVELS < 3 |
| @@ -603,7 +603,7 @@ static inline unsigned long pmd_page_vaddr(pmd_t pmd) |
| #define pud_none(pud) (!pud_val(pud)) |
| #define pud_bad(pud) (!pud_table(pud)) |
| #define pud_present(pud) pte_present(pud_pte(pud)) |
| -#define pud_leaf(pud) pud_sect(pud) |
| +#define pud_leaf(pud) (pud_present(pud) && !pud_table(pud)) |
| #define pud_valid(pud) pte_valid(pud_pte(pud)) |
| |
| static inline void set_pud(pud_t *pudp, pud_t pud) |
| -- |
| 2.35.1 |
| |