diff mbox series

[v1,2/3] scsi: ufs: Cancel rpm_dev_flush_recheck_work during system suspend

Message ID 1619403878-28330-3-git-send-email-cang@codeaurora.org
State New
Headers show
Series Three minor fixes w.r.t suspend/resume | expand

Commit Message

Can Guo April 26, 2021, 2:24 a.m. UTC
During ufs system suspend, leaving rpm_dev_flush_recheck_work running or
pending is risky, because concurrency may happen btw system suspend/resume
and runtime resume routine. Fix it by cancelling rpm_dev_flush_recheck_work
synchronously during system suspend.

Fixes: 1d53864c3617f5235f891ca0fbe9347c4cd35d46 ("scsi: ufs: Fix possible power drain during system suspend")
Signed-off-by: Can Guo <cang@codeaurora.org>
---
 drivers/scsi/ufs/ufshcd.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Daejun Park April 26, 2021, 3:17 a.m. UTC | #1
Hi Can Guo,

>diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
>index 7ab6b12..090b654 100644
>--- a/drivers/scsi/ufs/ufshcd.c
>+++ b/drivers/scsi/ufs/ufshcd.c
>@@ -9058,11 +9058,12 @@ int ufshcd_system_suspend(struct ufs_hba *hba)
>         if (!hba->is_powered)
>                 return 0;
> 
>+        cancel_delayed_work_sync(&hba->rpm_dev_flush_recheck_work);
>+
>         if ((ufs_get_pm_lvl_to_dev_pwr_mode(hba->spm_lvl) ==
>              hba->curr_dev_pwr_mode) &&
>             (ufs_get_pm_lvl_to_link_pwr_state(hba->spm_lvl) ==
>-             hba->uic_link_state) &&
>-             !hba->dev_info.b_rpm_dev_flush_capable)
I think it should not be removed.
It prevents power drain when runtime suspend and system suspend have same
power mode.

Thanks,
Daejun
diff mbox series

Patch

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 7ab6b12..090b654 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -9058,11 +9058,12 @@  int ufshcd_system_suspend(struct ufs_hba *hba)
 	if (!hba->is_powered)
 		return 0;
 
+	cancel_delayed_work_sync(&hba->rpm_dev_flush_recheck_work);
+
 	if ((ufs_get_pm_lvl_to_dev_pwr_mode(hba->spm_lvl) ==
 	     hba->curr_dev_pwr_mode) &&
 	    (ufs_get_pm_lvl_to_link_pwr_state(hba->spm_lvl) ==
-	     hba->uic_link_state) &&
-	     !hba->dev_info.b_rpm_dev_flush_capable)
+	     hba->uic_link_state))
 		goto out;
 
 	if (pm_runtime_suspended(hba->dev)) {