• Jan Kara's avatar
    IB/qib: Convert qib_user_sdma_pin_pages() to use get_user_pages_fast() · 434700a2
    Jan Kara authored
    commit 603e7729 upstream.
    
    qib_user_sdma_queue_pkts() gets called with mmap_sem held for
    writing. Except for get_user_pages() deep down in
    qib_user_sdma_pin_pages() we don't seem to need mmap_sem at all.  Even
    more interestingly the function qib_user_sdma_queue_pkts() (and also
    qib_user_sdma_coalesce() called somewhat later) call copy_from_user()
    which can hit a page fault and we deadlock on trying to get mmap_sem
    when handling that fault.
    
    So just make qib_user_sdma_pin_pages() use get_user_pages_fast() and
    leave mmap_sem locking for mm.
    
    This deadlock has actually been observed in the wild when the node
    is under memory pressure.
    Reviewed-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
    [bwh: Backported to 3.2:
     - Adjust context
     - Adjust indentation and nr_pages argument in qib_user_sdma_pin_pages()]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    434700a2
qib_user_sdma.c 21 KB