Skip to content
  • Derek Basehore's avatar
    block: remove deadlock in disk_clear_events · aea24a8b
    Derek Basehore authored
    
    
    In disk_clear_events, do not put work on system_nrt_freezable_wq.
    Instead, put it on system_nrt_wq.
    
    There is a race between probing a usb and suspending the device.  Since
    probing a usb calls disk_clear_events, which puts work on a frozen
    workqueue, probing cannot finish after the workqueue is frozen.  However,
    suspending cannot finish until the usb probe is finished, so we get a
    deadlock, causing the system to reboot.
    
    The way to reproduce this bug is to wake up from suspend with a usb
    storage device plugged in, or plugging in a usb storage device right
    before suspend.  The window of time is on the order of time it takes to
    probe the usb device.  As long as the workqueues are frozen before the
    call to add_disk within sd_probe_async finishes, there will be a deadlock
    (which calls blkdev_get, sd_open, check_disk_change, then
    disk_clear_events).  This is not difficult to reproduce after figuring out
    the timings.
    
    [akpm@linux-foundation.org: fix up comment]
    Signed-off-by: default avatarDerek Basehore <dbasehore@chromium.org>
    Reviewed-by: default avatarMandeep Singh Baines <msb@chromium.org>
    Cc: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    aea24a8b