[PATCH] arm64/mm: restrict transparent contpte mappings to valid PTEs
Lance Yang
lance.yang at linux.dev
Tue Oct 13 08:39:53 PDT 2026
On Tue, Oct 13, 2026 at 05:36:00PM +0800, Zhao Gongyi wrote:
[...]
>
>Fixes: 4602e5757bcc ("arm64/mm: wire up PTE_CONT for user mappings")
>Cc: stable at vger.kernel.org
>Signed-off-by: Zhao Gongyi <zhaogongyi at bytedance.com>
>---
Good catch! Thanks!
[...]
>diff --git a/arch/arm64/mm/contpte.c b/arch/arm64/mm/contpte.c
>index 0acab179f..851fa2e44 100644
>--- a/arch/arm64/mm/contpte.c
>+++ b/arch/arm64/mm/contpte.c
>@@ -463,6 +463,13 @@ void contpte_set_ptes(struct mm_struct *mm, unsigned long addr,
> if (!mm_is_user(mm))
> return __set_ptes(mm, addr, ptep, pte, nr);
>
>+ /*
>+ * Keep the producer-side invariant documented in pgtable.h true even
>+ * if a direct caller passes an invalid descriptor with PTE_CONT set.
>+ */
>+ if (!pte_valid(pte))
>+ return __set_ptes(mm, addr, ptep, pte_mknoncont(pte), nr);
set_ptes() is the only in-tree caller, and it already clears PTE_CONT
before we get here ... no? Why not fold !pte_valid(pte) into the
!mm_is_user(mm) check below and return __set_ptes() directly?
if (!mm_is_user(mm) || !pte_valid(pte))
return __set_ptes(mm, addr, ptep, pte, nr);
If a direct caller does pass a !pte_valid PTE with PTE_CONT set, I'd
rather add a VM_WARN_ON() to catch that. Silently clearing the bit would
hide a caller bug :)
Cheers, Lance
>+
> end = addr + (nr << PAGE_SHIFT);
> pfn = pte_pfn(pte);
> prot = pte_pgprot(pte);
>--
>2.39.5 (Apple Git-154)
>
More information about the linux-arm-kernel
mailing list