2020-02-08 00:52:24

by Can Guo

[permalink] [raw]
Subject: [PATCH 5/7] scsi: ufs: Fix ufshcd_hold() caused scheduling while atomic

The async version of ufshcd_hold(async == true), which is only called
in queuecommand path as for now, is expected to work in atomic context,
thus it should not sleep or schedule out. When it runs into the condition
that clocks are ON but link is still in hibern8 state, it should bail out
without flushing the clock ungate work.

Signed-off-by: Can Guo <[email protected]>
Reviewed-by: Hongwu Su <[email protected]>
Reviewed-by: Asutosh Das <[email protected]>
Reviewed-by: Bean Huo <[email protected]>
Reviewed-by: Stanley Chu <[email protected]>

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index bbc2607..e8f7f9d 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -1518,6 +1518,11 @@ int ufshcd_hold(struct ufs_hba *hba, bool async)
*/
if (ufshcd_can_hibern8_during_gating(hba) &&
ufshcd_is_link_hibern8(hba)) {
+ if (async) {
+ rc = -EAGAIN;
+ hba->clk_gating.active_reqs--;
+ break;
+ }
spin_unlock_irqrestore(hba->host->host_lock, flags);
flush_work(&hba->clk_gating.ungate_work);
spin_lock_irqsave(hba->host->host_lock, flags);
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project


2020-02-09 07:49:28

by Avri Altman

[permalink] [raw]
Subject: RE: [PATCH 5/7] scsi: ufs: Fix ufshcd_hold() caused scheduling while atomic



You didn't address any of my comments to this patch.

Thanks,
Avri
>
> The async version of ufshcd_hold(async == true), which is only called
> in queuecommand path as for now, is expected to work in atomic context,
> thus it should not sleep or schedule out. When it runs into the condition
> that clocks are ON but link is still in hibern8 state, it should bail out
> without flushing the clock ungate work.
>
> Signed-off-by: Can Guo <[email protected]>
> Reviewed-by: Hongwu Su <[email protected]>
> Reviewed-by: Asutosh Das <[email protected]>
> Reviewed-by: Bean Huo <[email protected]>
> Reviewed-by: Stanley Chu <[email protected]>
>
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index bbc2607..e8f7f9d 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -1518,6 +1518,11 @@ int ufshcd_hold(struct ufs_hba *hba, bool async)
> */
> if (ufshcd_can_hibern8_during_gating(hba) &&
> ufshcd_is_link_hibern8(hba)) {
> + if (async) {
> + rc = -EAGAIN;
> + hba->clk_gating.active_reqs--;
> + break;
> + }
> spin_unlock_irqrestore(hba->host->host_lock, flags);
> flush_work(&hba->clk_gating.ungate_work);
> spin_lock_irqsave(hba->host->host_lock, flags);
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora
> Forum,
> a Linux Foundation Collaborative Project

2020-02-10 02:01:44

by Can Guo

[permalink] [raw]
Subject: Re: [PATCH 5/7] scsi: ufs: Fix ufshcd_hold() caused scheduling while atomic

On 2020-02-09 15:48, Avri Altman wrote:
> You didn't address any of my comments to this patch.
>
> Thanks,
> Avri

Replied in that thread.

Thanks,
Can Guo.

>>
>> The async version of ufshcd_hold(async == true), which is only called
>> in queuecommand path as for now, is expected to work in atomic
>> context,
>> thus it should not sleep or schedule out. When it runs into the
>> condition
>> that clocks are ON but link is still in hibern8 state, it should bail
>> out
>> without flushing the clock ungate work.
>>
>> Signed-off-by: Can Guo <[email protected]>
>> Reviewed-by: Hongwu Su <[email protected]>
>> Reviewed-by: Asutosh Das <[email protected]>
>> Reviewed-by: Bean Huo <[email protected]>
>> Reviewed-by: Stanley Chu <[email protected]>
>>
>> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
>> index bbc2607..e8f7f9d 100644
>> --- a/drivers/scsi/ufs/ufshcd.c
>> +++ b/drivers/scsi/ufs/ufshcd.c
>> @@ -1518,6 +1518,11 @@ int ufshcd_hold(struct ufs_hba *hba, bool
>> async)
>> */
>> if (ufshcd_can_hibern8_during_gating(hba) &&
>> ufshcd_is_link_hibern8(hba)) {
>> + if (async) {
>> + rc = -EAGAIN;
>> + hba->clk_gating.active_reqs--;
>> + break;
>> + }
>> spin_unlock_irqrestore(hba->host->host_lock,
>> flags);
>> flush_work(&hba->clk_gating.ungate_work);
>> spin_lock_irqsave(hba->host->host_lock,
>> flags);
>> --
>> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora
>> Forum,
>> a Linux Foundation Collaborative Project