Messages in this thread | | | Subject | Re: [PATCH] userfaultfd: hugetlbfs: Fix userfaultfd_huge_must_wait pte access | From | David Hildenbrand <> | Date | Tue, 26 Jun 2018 15:39:32 +0200 |
| |
On 26.06.2018 15:24, Janosch Frank wrote: > 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. > > Signed-off-by: Janosch Frank <frankja@linux.ibm.com> > Fixes: 369cd2121be4 ("userfaultfd: hugetlbfs: userfaultfd_huge_must_wait for hugepmd ranges") > --- > fs/userfaultfd.c | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c > index 123bf7d516fc..594d192b2331 100644 > --- a/fs/userfaultfd.c > +++ b/fs/userfaultfd.c > @@ -222,24 +222,26 @@ static inline bool userfaultfd_huge_must_wait(struct userfaultfd_ctx *ctx, > 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; >
Indeed, this only works by luck on x86 and ppc, but not on s390x.
Reviewed-by: David Hildenbrand <david@redhat.com>
--
Thanks,
David / dhildenb
| |