On 2020-05-02 01:56, Bart Van Assche wrote:
On 2020-04-30 22:12, Can Guo wrote:
diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c
index 3717eea..d18271d 100644
--- a/drivers/scsi/scsi_pm.c
+++ b/drivers/scsi/scsi_pm.c
@@ -74,12 +74,15 @@ static int scsi_dev_type_resume(struct device
*dev,
{
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm :
NULL;
int err = 0;
+ bool was_rpm_suspended = false;
err = cb(dev, pm);
scsi_device_resume(to_scsi_device(dev));
dev_dbg(dev, "scsi resume: %d\n", err);
if (err == 0) {
+ was_rpm_suspended = pm_runtime_suspended(dev);
+
How about renaming this variable into "was_runtime_suspended"? How
about
moving the declaration of that variable inside the if-statement?
Sure, shall do, this patch was just a prototype which I made for
testing.
If you are OK with this idea, I will send it as the next version.
pm_runtime_disable(dev);
err = pm_runtime_set_active(dev);
pm_runtime_enable(dev);
@@ -93,8 +96,10 @@ static int scsi_dev_type_resume(struct device *dev,
*/
if (!err && scsi_is_sdev_device(dev)) {
struct scsi_device *sdev =
to_scsi_device(dev);
-
- blk_set_runtime_active(sdev->request_queue);
+ if (was_rpm_suspended)
+
blk_post_runtime_resume(sdev->request_queue, 0);
+ else
+
blk_set_runtime_active(sdev->request_queue);
}
}
Does other code always call both blk_pre_runtime_resume() and
blk_post_runtime_resume() upon runtime resume? How about adding a
blk_pre_runtime_resume() call before the blk_post_runtime_resume()
call?
Thanks,
Bart.
Yes, but adding a blk_pre_runtime_resume() here is meaningless, it only
sets the q->rpm_status to RPM_RESUMING, blk_post_runtime_resume()
overrides
it to RPM_ACTIVE for sure. Besides, this place comes after the call of
pm_runtime_set_active(), meaning sdev is already runtime active, in
contrast
with the real runtime resume routine, we can think it as the sdev's
runtime
resume ops has returned 0, so we can just call
blk_post_runtime_resume(err=0).
Thanks,
Can Guo.