2021-05-24 08:51:44

by Can Guo

[permalink] [raw]
Subject: [PATCH v2 5/6] scsi: ufs: Let host_sem cover the entire system suspend/resume

UFS error handling now is doing more than just re-probing, but also sending
scsi cmds, e.g., for clearing UACs, and recovering runtime PM error, which
may change runtime status of scsi devices. To protect system suspend/resume
from being disturbed by error handling, move the host_sem from wl pm ops
to ufshcd_suspend_prepare() and ufshcd_resume_complete().

Signed-off-by: Can Guo <[email protected]>
---
drivers/scsi/ufs/ufshcd.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 5e6e3ac..9a3bc04 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -9057,16 +9057,13 @@ static int ufshcd_wl_suspend(struct device *dev)
ktime_t start = ktime_get();

hba = shost_priv(sdev->host);
- down(&hba->host_sem);

if (pm_runtime_suspended(dev))
goto out;

ret = __ufshcd_wl_suspend(hba, UFS_SYSTEM_PM);
- if (ret) {
+ if (ret)
dev_err(&sdev->sdev_gendev, "%s failed: %d\n", __func__, ret);
- up(&hba->host_sem);
- }

out:
if (!ret)
@@ -9099,7 +9096,6 @@ static int ufshcd_wl_resume(struct device *dev)
hba->curr_dev_pwr_mode, hba->uic_link_state);
if (!ret)
hba->is_wl_sys_suspended = false;
- up(&hba->host_sem);
return ret;
}
#endif
@@ -9666,6 +9662,7 @@ void ufshcd_resume_complete(struct device *dev)
ufshcd_rpmb_rpm_put(hba);
hba->rpmb_complete_put = false;
}
+ up(&hba->host_sem);
}
EXPORT_SYMBOL_GPL(ufshcd_resume_complete);

@@ -9692,6 +9689,7 @@ int ufshcd_suspend_prepare(struct device *dev)
ufshcd_rpmb_rpm_get_sync(hba);
hba->rpmb_complete_put = true;
}
+ down(&hba->host_sem);
return 0;
}
EXPORT_SYMBOL_GPL(ufshcd_suspend_prepare);
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.


2021-05-24 16:57:34

by Bart Van Assche

[permalink] [raw]
Subject: Re: [PATCH v2 5/6] scsi: ufs: Let host_sem cover the entire system suspend/resume

On 5/24/21 1:47 AM, Can Guo wrote:
> UFS error handling now is doing more than just re-probing, but also sending
> scsi cmds, e.g., for clearing UACs, and recovering runtime PM error, which
> may change runtime status of scsi devices. To protect system suspend/resume
> from being disturbed by error handling, move the host_sem from wl pm ops
> to ufshcd_suspend_prepare() and ufshcd_resume_complete().

Other SCSI LLDs can perform error handling while system suspend/resume
is in progress. Why can't the UFS driver do this?

Additionally, please document what the purpose of host_sem is before
making any changes to how host_sem is used. The only documentation I
have found of host_sem is the following: "* @host_sem: semaphore used to
serialize concurrent contexts". To me that text is less than useful
since semaphores are almost always used to serialize concurrent code.

Thanks,

Bart.

2021-05-25 02:06:09

by Can Guo

[permalink] [raw]
Subject: Re: [PATCH v2 5/6] scsi: ufs: Let host_sem cover the entire system suspend/resume

Hi Bart,

On 2021-05-25 00:56, Bart Van Assche wrote:
> On 5/24/21 1:47 AM, Can Guo wrote:
>> UFS error handling now is doing more than just re-probing, but also
>> sending
>> scsi cmds, e.g., for clearing UACs, and recovering runtime PM error,
>> which
>> may change runtime status of scsi devices. To protect system
>> suspend/resume
>> from being disturbed by error handling, move the host_sem from wl pm
>> ops
>> to ufshcd_suspend_prepare() and ufshcd_resume_complete().
>
> Other SCSI LLDs can perform error handling while system suspend/resume
> is in progress. Why can't the UFS driver do this?

I don't know about other SCSI LLDs, but UFS error handling is basically
doing a re-probe/re-initialization to UFS device. Having UFS error
handling
running in parallel with system suspend/resume, neither of them will end
up well.

I didn't design all this, it is just happening, I am trying to fix it
and
semaphore works well for me. I am really glad to see someone cares about
error handling and fix it with better ideas (maybe using WQ_FREEZABLE)
later.

>
> Additionally, please document what the purpose of host_sem is before
> making any changes to how host_sem is used. The only documentation I
> have found of host_sem is the following: "* @host_sem: semaphore used
> to
> serialize concurrent contexts". To me that text is less than useful
> since semaphores are almost always used to serialize concurrent code.
>

Sure, host_sem is actually preventing cocurrency happens among any of
contexts, such as sysfs access, shutdown, error handling, system
suspend/resume and async probe, I will update its message in next
version.

Thanks,

Can Guo.

> Thanks,
>
> Bart.