• Jan Kara's avatar
    IB/ipath: Convert ipath_user_sdma_pin_pages() to use get_user_pages_fast() · 4adcf7fb
    Jan Kara authored
    ipath_user_sdma_queue_pkts() gets called with mmap_sem held for
    writing.  Except for get_user_pages() deep down in
    ipath_user_sdma_pin_pages() we don't seem to need mmap_sem at all.
    
    Even more interestingly the function ipath_user_sdma_queue_pkts() (and
    also ipath_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
    ipath_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.
    
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
    
    [ Merged in fix for call to get_user_pages_fast from Tetsuo Handa
      <penguin-kernel@I-love.SAKURA.ne.jp>.  - Roland ]
    Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
    4adcf7fb
ipath_user_sdma.c 20.8 KB