• Huang Ying's avatar
    mm, userfaultfd, THP: avoid waiting when PMD under THP migration · a365ac09
    Huang Ying authored
    If THP migration is enabled, for a VMA handled by userfaultfd, consider
    the following situation,
    
      do_page_fault()
        __do_huge_pmd_anonymous_page()
         handle_userfault()
           userfault_msg()
             /* a huge page is allocated and mapped at fault address */
             /* the huge page is under migration, leaves migration entry
                in page table */
           userfaultfd_must_wait()
             /* return true because !pmd_present() */
           /* may wait in loop until fatal signal */
    
    That is, it may be possible for userfaultfd_must_wait() encounters a PMD
    entry which is !pmd_none() && !pmd_present().  In the current
    implementation, we will wait for such PMD entries, which may cause
    unnecessary waiting, and potential soft lockup.
    
    This is fixed via avoiding to wait when !pmd_none() && !pmd_present(),
    only wait when pmd_none().
    
    This may be not a problem in practice, because userfaultfd_must_wait()
    is always called with mm->mmap_sem read-locked.  mremap() will
    write-lock mm->mmap_sem.  And UFFDIO_COPY doesn't support to copy THP
    mapping.  But the change introduced still makes the code more correct,
    and makes the PMD and PTE code more consistent.
    
    Link: http://lkml.kernel.org/r/20171207011752.3292-1-ying.huang@intel.comSigned-off-by: default avatar"Huang, Ying" <ying.huang@intel.com>
    Reviewed-by: default avatarAndrea Arcangeli <aarcange@redhat.com>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Mike Rapoport <rppt@linux.vnet.ibm.com>
    Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.UK>
    Cc: Zi Yan <zi.yan@cs.rutgers.edu>
    Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a365ac09
userfaultfd.c 50.6 KB