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 <[email protected]> > 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 <[email protected]> -- Thanks, David / dhildenb

