scsi: pm: keep request queue and scsi device runtime status in sync

If scsi device is not runtime suspended while system resumes then
scsi device's runtime PM status gets changed to RPM_ACTIVE (if its
parent status is already set to RPM_ACTIVE) by the scsi system resume
callback. But if the scsi device's runtime PM is managed by block layer
then runtime status of scsi device's request queue might still remain
in RPM_SUSPENDED hence all the new block requests submitted to the
request queue will have to wait until the queue runtime status gets
changed to RPM_ACTIVE which never happens as scsi device status is
already marked RPM_ACTIVE.

Fix this problem by changing the request queue runtime status to
RPM_ACTIVE when scsi device runtime status changes to RPM_ACTIVE.

Change-Id: I310cf8f1d7f13008b0ab9d87564fc0ac4d2e2314
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
This commit is contained in:
Subhash Jadavani 2014-11-18 00:54:25 -08:00
parent 4ef088c447
commit 9e990307b6
1 changed files with 15 additions and 1 deletions

View File

@ -74,9 +74,23 @@ scsi_bus_resume_common(struct device *dev, int (*cb)(struct device *))
err = scsi_dev_type_resume(dev, cb);
if (err == 0) {
int ret;
pm_runtime_disable(dev);
pm_runtime_set_active(dev);
ret = pm_runtime_set_active(dev);
pm_runtime_enable(dev);
if (!ret && scsi_is_sdev_device(dev)) {
struct scsi_device *sdev = to_scsi_device(dev);
/*
* If scsi device runtime PM is managed by block layer
* then we should update request queue's runtime status
* as well.
*/
if (sdev->request_queue->dev)
blk_post_runtime_resume(sdev->request_queue, 0);
}
}
return err;
}