Skip to content
  • Mike Kravetz's avatar
    mm/hugetlbfs: unmap pages if page fault raced with hole punch · 4aae8d1c
    Mike Kravetz authored
    
    
    Page faults can race with fallocate hole punch.  If a page fault happens
    between the unmap and remove operations, the page is not removed and
    remains within the hole.  This is not the desired behavior.  The race is
    difficult to detect in user level code as even in the non-race case, a
    page within the hole could be faulted back in before fallocate returns.
    If userfaultfd is expanded to support hugetlbfs in the future, this race
    will be easier to observe.
    
    If this race is detected and a page is mapped, the remove operation
    (remove_inode_hugepages) will unmap the page before removing.  The unmap
    within remove_inode_hugepages occurs with the hugetlb_fault_mutex held
    so that no other faults will be processed until the page is removed.
    
    The (unmodified) routine hugetlb_vmdelete_list was moved ahead of
    remove_inode_hugepages to satisfy the new reference.
    
    [akpm@linux-foundation.org: move hugetlb_vmdelete_list()]
    Signed-off-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: Hillf Danton <hillf.zj@alibaba-inc.com>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    4aae8d1c