Re: [PATCH v3 1/1] scsi: pm: Balance pm_only counter of request queue during system resume

From: Can Guo
Date: Fri May 01 2020 - 22:00:34 EST


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.