userfaultfd: hugetlbfs: fix userfaultfd_huge_must_wait() pte access
Subsystems (2)
PATCH 1/5 userfaultfd: hugetlbfs: fix userfaultfd_huge_must_wait() pte access
From: Janosch Frank <[email protected]>
Subject: userfaultfd: hugetlbfs: fix userfaultfd_huge_must_wait() pte access
Use huge_ptep_get() to translate huge ptes to normal ptes so we can check them with the huge_pte_* functions. Otherwise some architectures will check the wrong values and will not wait for userspace to bring in the memory.
Fixes 369cd2121be4 ("userfaultfd: hugetlbfs: userfaultfd_huge_must_wait for hugepmd ranges")
Signed-off-by Janosch Frank <[email protected]>
Reviewed-by David Hildenbrand <[email protected]>
Reviewed-by Mike Kravetz <[email protected]>
Cc Andrea Arcangeli <[email protected]>
Cc <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
---
fs/userfaultfd.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
fs/userfaultfd.c renamed from fs/userfaultfd.c~userfaultfd-hugetlbfs-fix-userfaultfd_huge_must_wait-pte-access +7 -5
@@ -222,24 +222,26 @@ static inline bool userfaultfd_huge_must unsigned long reason) {struct mm_struct *mm = ctx->mm; -pte_t *pte; +pte_t *ptep, pte;bool ret = true;VM_BUG_ON (!rwsem_is_locked (&mm->mmap_sem)); - pte =huge_pte_offset (mm, address,vma_mmu_pagesize (vma)); -if (!pte) + ptep =huge_pte_offset (mm, address,vma_mmu_pagesize (vma)); + +if (!ptep) goto out; ret = false; + pte =huge_ptep_get (ptep);/* * Lockless access: we're in a wait_event so it's ok if it * changes under us. */ -if (huge_pte_none (*pte)) +if (huge_pte_none (pte)) ret = true; -if (!huge_pte_write (*pte) && (reason &VM_UFFD_WP )) +if (!huge_pte_write (pte) && (reason &VM_UFFD_WP )) ret = true; out:return ret;
_