| From 89f9478be2d3d43826946a19eef1db1976856bd8 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 08363d3cc1da..ed57717cd004 100644 |
| --- a/arch/arm64/include/asm/pgtable.h |
| +++ b/arch/arm64/include/asm/pgtable.h |
| @@ -535,7 +535,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)) |
| |
| #define pmd_leaf_size(pmd) (pmd_cont(pmd) ? CONT_PMD_SIZE : PMD_SIZE) |
| @@ -625,7 +625,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 |
| |