• J
    dm bufio: fix deadlock with loop device · 025eb12b
    Junxiao Bi 提交于
    commit bd293d071ffe65e645b4d8104f9d8fe15ea13862 upstream.
    
    When thin-volume is built on loop device, if available memory is low,
    the following deadlock can be triggered:
    
    One process P1 allocates memory with GFP_FS flag, direct alloc fails,
    memory reclaim invokes memory shrinker in dm_bufio, dm_bufio_shrink_scan()
    runs, mutex dm_bufio_client->lock is acquired, then P1 waits for dm_buffer
    IO to complete in __try_evict_buffer().
    
    But this IO may never complete if issued to an underlying loop device
    that forwards it using direct-IO, which allocates memory using
    GFP_KERNEL (see: do_blockdev_direct_IO()).  If allocation fails, memory
    reclaim will invoke memory shrinker in dm_bufio, dm_bufio_shrink_scan()
    will be invoked, and since the mutex is already held by P1 the loop
    thread will hang, and IO will never complete.  Resulting in ABBA
    deadlock.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: NJunxiao Bi <junxiao.bi@oracle.com>
    Signed-off-by: NMike Snitzer <snitzer@redhat.com>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    025eb12b
dm-bufio.c 47.9 KB