• Mike Kravetz's avatar
    mm/hugetlb: fix deadlock in hugetlb_cow error path · e7dd91c4
    Mike Kravetz authored
    syzbot reported the deadlock here [1].  The issue is in hugetlb cow
    error handling when there are not enough huge pages for the faulting
    task which took the original reservation.  It is possible that other
    (child) tasks could have consumed pages associated with the reservation.
    In this case, we want the task which took the original reservation to
    succeed.  So, we unmap any associated pages in children so that they can
    be used by the faulting task that owns the reservation.
    
    The unmapping code needs to hold i_mmap_rwsem in write mode.  However,
    due to commit c0d0381a ("hugetlbfs: use i_mmap_rwsem for more pmd
    sharing synchronization") we are already holding i_mmap_rwsem in read
    mode when hugetlb_cow is called.
    
    Technically, i_mmap_rwsem does not need to be held in read mode for COW
    mappings as they can not share pmd's.  Modifying the fault code to not
    take i_mmap_rwsem in read mode for COW (and other non-sharable) mappings
    is too involved for a stable fix.
    
    Instead, we simply drop the hugetlb_fault_mutex and i_mmap_rwsem before
    unmapping.  This is OK as it is technically not needed.  They are
    reacquired after unmapping as expected by calling code.  Since this is
    done in an uncommon error path, the overhead of dropping and reacquiring
    mutexes is acceptable.
    
    While making changes, remove redundant BUG_ON after unmap_ref_private.
    
    [1] https://lkml.kernel.org/r/000000000000b73ccc05b5cf8558@google.com
    
    Link: https://lkml.kernel.org/r/4c5781b8-3b00-761e-c0c7-c5edebb6ec1a@oracle.com
    Fixes: c0d0381a ("hugetlbfs: use i_mmap_rwsem for more pmd sharing synchronization")
    Signed-off-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Reported-by: syzbot+5eee4145df3c15e96625@syzkaller.appspotmail.com
    Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: "Aneesh Kumar K . V" <aneesh.kumar@linux.vnet.ibm.com>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e7dd91c4
hugetlb.c 155 KB