• Mika Westerberg's avatar
    scsi: Set request queue runtime PM status back to active on resume · 356fd266
    Mika Westerberg authored
    We treat system suspend of SCSI devices pretty much the same as runtime
    suspend. If the device is already runtime suspended we leave it to that
    state during system suspend. On resume from system sleep we then resume the
    device and correct the runtime PM status back to "active".
    
    There is a problem with this because runtime PM status of the request queue
    in question is not changed (it will be in "suspended" state). When SCSI
    disk driver (sd.c) resumes the disk it sends START message to the device
    and because the request queue is still in "suspended" state
    blk_pm_peek_request() returns NULL preventing resume of the disk.
    
    The issue can be reproduced with following commands:
    
      # echo auto > /sys/block/sda/device/power/control
      # echo 15000 > /sys/block/sda/device/power/autosuspend_delay_ms
      [   57.191706] sd 0:0:0:0: [sda] Synchronizing SCSI cache
      [   57.380015] sd 0:0:0:0: [sda] Stopping disk
    
    Now suspend the machine:
    
      # rtcwake -s10 -mmem
    
    This ends up in soft lockup because resume is not proceeding accordingly
    and userspace is never restarted. Also there is nothing printed to the
    console.
    
    Fix this by forcing request queue status to "active" before the disk is
    resumed.
    Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    356fd266