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:
parent
4ef088c447
commit
9e990307b6
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue