2020-10-27 06:37:12

by Jaegeuk Kim

[permalink] [raw]
Subject: [PATCH v4 1/5] scsi: ufs: atomic update for clkgating_enable

From: Jaegeuk Kim <[email protected]>

When giving a stress test which enables/disables clkgating, we hit device
timeout sometimes. This patch avoids subtle racy condition to address it.

Note that, this requires a patch to address the device stuck by REQ_CLKS_OFF in
__ufshcd_release().

The fix is "scsi: ufs: avoid to call REQ_CLKS_OFF to CLKS_OFF".

Signed-off-by: Jaegeuk Kim <[email protected]>
---
drivers/scsi/ufs/ufshcd.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index cc8d5f0c3fdc..6c9269bffcbd 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -1808,19 +1808,19 @@ static ssize_t ufshcd_clkgate_enable_store(struct device *dev,
return -EINVAL;

value = !!value;
+
+ spin_lock_irqsave(hba->host->host_lock, flags);
if (value == hba->clk_gating.is_enabled)
goto out;

- if (value) {
- ufshcd_release(hba);
- } else {
- spin_lock_irqsave(hba->host->host_lock, flags);
+ if (value)
+ __ufshcd_release(hba);
+ else
hba->clk_gating.active_reqs++;
- spin_unlock_irqrestore(hba->host->host_lock, flags);
- }

hba->clk_gating.is_enabled = value;
out:
+ spin_unlock_irqrestore(hba->host->host_lock, flags);
return count;
}

--
2.29.0.rc1.297.gfa9743e501-goog


2020-10-27 19:52:18

by Can Guo

[permalink] [raw]
Subject: Re: [PATCH v4 1/5] scsi: ufs: atomic update for clkgating_enable

On 2020-10-27 03:51, Jaegeuk Kim wrote:
> From: Jaegeuk Kim <[email protected]>
>
> When giving a stress test which enables/disables clkgating, we hit
> device
> timeout sometimes. This patch avoids subtle racy condition to address
> it.
>
> Note that, this requires a patch to address the device stuck by
> REQ_CLKS_OFF in
> __ufshcd_release().
>
> The fix is "scsi: ufs: avoid to call REQ_CLKS_OFF to CLKS_OFF".

Why don't you just squash the fix into this one?

Thanks,

Can Guo.

>
> Signed-off-by: Jaegeuk Kim <[email protected]>
> ---
> drivers/scsi/ufs/ufshcd.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index cc8d5f0c3fdc..6c9269bffcbd 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -1808,19 +1808,19 @@ static ssize_t
> ufshcd_clkgate_enable_store(struct device *dev,
> return -EINVAL;
>
> value = !!value;
> +
> + spin_lock_irqsave(hba->host->host_lock, flags);
> if (value == hba->clk_gating.is_enabled)
> goto out;
>
> - if (value) {
> - ufshcd_release(hba);
> - } else {
> - spin_lock_irqsave(hba->host->host_lock, flags);
> + if (value)
> + __ufshcd_release(hba);
> + else
> hba->clk_gating.active_reqs++;
> - spin_unlock_irqrestore(hba->host->host_lock, flags);
> - }
>
> hba->clk_gating.is_enabled = value;
> out:
> + spin_unlock_irqrestore(hba->host->host_lock, flags);
> return count;
> }

2020-10-27 20:42:53

by Jaegeuk Kim

[permalink] [raw]
Subject: Re: [PATCH v4 1/5] scsi: ufs: atomic update for clkgating_enable

On 10/27, Can Guo wrote:
> On 2020-10-27 03:51, Jaegeuk Kim wrote:
> > From: Jaegeuk Kim <[email protected]>
> >
> > When giving a stress test which enables/disables clkgating, we hit
> > device
> > timeout sometimes. This patch avoids subtle racy condition to address
> > it.
> >
> > Note that, this requires a patch to address the device stuck by
> > REQ_CLKS_OFF in
> > __ufshcd_release().
> >
> > The fix is "scsi: ufs: avoid to call REQ_CLKS_OFF to CLKS_OFF".
>
> Why don't you just squash the fix into this one?

I'm seeing this patch just revealed that problem.

>
> Thanks,
>
> Can Guo.
>
> >
> > Signed-off-by: Jaegeuk Kim <[email protected]>
> > ---
> > drivers/scsi/ufs/ufshcd.c | 12 ++++++------
> > 1 file changed, 6 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> > index cc8d5f0c3fdc..6c9269bffcbd 100644
> > --- a/drivers/scsi/ufs/ufshcd.c
> > +++ b/drivers/scsi/ufs/ufshcd.c
> > @@ -1808,19 +1808,19 @@ static ssize_t
> > ufshcd_clkgate_enable_store(struct device *dev,
> > return -EINVAL;
> >
> > value = !!value;
> > +
> > + spin_lock_irqsave(hba->host->host_lock, flags);
> > if (value == hba->clk_gating.is_enabled)
> > goto out;
> >
> > - if (value) {
> > - ufshcd_release(hba);
> > - } else {
> > - spin_lock_irqsave(hba->host->host_lock, flags);
> > + if (value)
> > + __ufshcd_release(hba);
> > + else
> > hba->clk_gating.active_reqs++;
> > - spin_unlock_irqrestore(hba->host->host_lock, flags);
> > - }
> >
> > hba->clk_gating.is_enabled = value;
> > out:
> > + spin_unlock_irqrestore(hba->host->host_lock, flags);
> > return count;
> > }

2020-10-27 20:44:07

by Can Guo

[permalink] [raw]
Subject: Re: [PATCH v4 1/5] scsi: ufs: atomic update for clkgating_enable

On 2020-10-27 11:33, Jaegeuk Kim wrote:
> On 10/27, Can Guo wrote:
>> On 2020-10-27 03:51, Jaegeuk Kim wrote:
>> > From: Jaegeuk Kim <[email protected]>
>> >
>> > When giving a stress test which enables/disables clkgating, we hit
>> > device
>> > timeout sometimes. This patch avoids subtle racy condition to address
>> > it.
>> >
>> > Note that, this requires a patch to address the device stuck by
>> > REQ_CLKS_OFF in
>> > __ufshcd_release().
>> >
>> > The fix is "scsi: ufs: avoid to call REQ_CLKS_OFF to CLKS_OFF".
>>
>> Why don't you just squash the fix into this one?
>
> I'm seeing this patch just revealed that problem.

That scenario (back to back calling of ufshcd_release()) only happens
when you stress the clkgate_enable sysfs node, so let's keep the fix
as one to make things simple. What do you think?

Thanks,

Can Guo.

>
>>
>> Thanks,
>>
>> Can Guo.
>>
>> >
>> > Signed-off-by: Jaegeuk Kim <[email protected]>
>> > ---
>> > drivers/scsi/ufs/ufshcd.c | 12 ++++++------
>> > 1 file changed, 6 insertions(+), 6 deletions(-)
>> >
>> > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
>> > index cc8d5f0c3fdc..6c9269bffcbd 100644
>> > --- a/drivers/scsi/ufs/ufshcd.c
>> > +++ b/drivers/scsi/ufs/ufshcd.c
>> > @@ -1808,19 +1808,19 @@ static ssize_t
>> > ufshcd_clkgate_enable_store(struct device *dev,
>> > return -EINVAL;
>> >
>> > value = !!value;
>> > +
>> > + spin_lock_irqsave(hba->host->host_lock, flags);
>> > if (value == hba->clk_gating.is_enabled)
>> > goto out;
>> >
>> > - if (value) {
>> > - ufshcd_release(hba);
>> > - } else {
>> > - spin_lock_irqsave(hba->host->host_lock, flags);
>> > + if (value)
>> > + __ufshcd_release(hba);
>> > + else
>> > hba->clk_gating.active_reqs++;
>> > - spin_unlock_irqrestore(hba->host->host_lock, flags);
>> > - }
>> >
>> > hba->clk_gating.is_enabled = value;
>> > out:
>> > + spin_unlock_irqrestore(hba->host->host_lock, flags);
>> > return count;
>> > }

2020-10-29 02:48:44

by Jaegeuk Kim

[permalink] [raw]
Subject: Re: [PATCH v4 1/5] scsi: ufs: atomic update for clkgating_enable

On 10/27, Can Guo wrote:
> On 2020-10-27 11:33, Jaegeuk Kim wrote:
> > On 10/27, Can Guo wrote:
> > > On 2020-10-27 03:51, Jaegeuk Kim wrote:
> > > > From: Jaegeuk Kim <[email protected]>
> > > >
> > > > When giving a stress test which enables/disables clkgating, we hit
> > > > device
> > > > timeout sometimes. This patch avoids subtle racy condition to address
> > > > it.
> > > >
> > > > Note that, this requires a patch to address the device stuck by
> > > > REQ_CLKS_OFF in
> > > > __ufshcd_release().
> > > >
> > > > The fix is "scsi: ufs: avoid to call REQ_CLKS_OFF to CLKS_OFF".
> > >
> > > Why don't you just squash the fix into this one?
> >
> > I'm seeing this patch just revealed that problem.
>
> That scenario (back to back calling of ufshcd_release()) only happens
> when you stress the clkgate_enable sysfs node, so let's keep the fix
> as one to make things simple. What do you think?

If we don't have this patch, do you think this issue won't happen at all?

>
> Thanks,
>
> Can Guo.
>
> >
> > >
> > > Thanks,
> > >
> > > Can Guo.
> > >
> > > >
> > > > Signed-off-by: Jaegeuk Kim <[email protected]>
> > > > ---
> > > > drivers/scsi/ufs/ufshcd.c | 12 ++++++------
> > > > 1 file changed, 6 insertions(+), 6 deletions(-)
> > > >
> > > > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> > > > index cc8d5f0c3fdc..6c9269bffcbd 100644
> > > > --- a/drivers/scsi/ufs/ufshcd.c
> > > > +++ b/drivers/scsi/ufs/ufshcd.c
> > > > @@ -1808,19 +1808,19 @@ static ssize_t
> > > > ufshcd_clkgate_enable_store(struct device *dev,
> > > > return -EINVAL;
> > > >
> > > > value = !!value;
> > > > +
> > > > + spin_lock_irqsave(hba->host->host_lock, flags);
> > > > if (value == hba->clk_gating.is_enabled)
> > > > goto out;
> > > >
> > > > - if (value) {
> > > > - ufshcd_release(hba);
> > > > - } else {
> > > > - spin_lock_irqsave(hba->host->host_lock, flags);
> > > > + if (value)
> > > > + __ufshcd_release(hba);
> > > > + else
> > > > hba->clk_gating.active_reqs++;
> > > > - spin_unlock_irqrestore(hba->host->host_lock, flags);
> > > > - }
> > > >
> > > > hba->clk_gating.is_enabled = value;
> > > > out:
> > > > + spin_unlock_irqrestore(hba->host->host_lock, flags);
> > > > return count;
> > > > }

2020-11-03 13:30:53

by Can Guo

[permalink] [raw]
Subject: Re: [PATCH v4 1/5] scsi: ufs: atomic update for clkgating_enable

On 2020-10-29 03:43, Jaegeuk Kim wrote:
> On 10/27, Can Guo wrote:
>> On 2020-10-27 11:33, Jaegeuk Kim wrote:
>> > On 10/27, Can Guo wrote:
>> > > On 2020-10-27 03:51, Jaegeuk Kim wrote:
>> > > > From: Jaegeuk Kim <[email protected]>
>> > > >
>> > > > When giving a stress test which enables/disables clkgating, we hit
>> > > > device
>> > > > timeout sometimes. This patch avoids subtle racy condition to address
>> > > > it.
>> > > >
>> > > > Note that, this requires a patch to address the device stuck by
>> > > > REQ_CLKS_OFF in
>> > > > __ufshcd_release().
>> > > >
>> > > > The fix is "scsi: ufs: avoid to call REQ_CLKS_OFF to CLKS_OFF".
>> > >
>> > > Why don't you just squash the fix into this one?
>> >
>> > I'm seeing this patch just revealed that problem.
>>
>> That scenario (back to back calling of ufshcd_release()) only happens
>> when you stress the clkgate_enable sysfs node, so let's keep the fix
>> as one to make things simple. What do you think?
>
> If we don't have this patch, do you think this issue won't happen at
> all?
>

At least I've never seen this scenario these years, otherwise I would
have
put up a fix.

Thanks,

Can Guo.

>>
>> Thanks,
>>
>> Can Guo.
>>
>> >
>> > >
>> > > Thanks,
>> > >
>> > > Can Guo.
>> > >
>> > > >
>> > > > Signed-off-by: Jaegeuk Kim <[email protected]>
>> > > > ---
>> > > > drivers/scsi/ufs/ufshcd.c | 12 ++++++------
>> > > > 1 file changed, 6 insertions(+), 6 deletions(-)
>> > > >
>> > > > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
>> > > > index cc8d5f0c3fdc..6c9269bffcbd 100644
>> > > > --- a/drivers/scsi/ufs/ufshcd.c
>> > > > +++ b/drivers/scsi/ufs/ufshcd.c
>> > > > @@ -1808,19 +1808,19 @@ static ssize_t
>> > > > ufshcd_clkgate_enable_store(struct device *dev,
>> > > > return -EINVAL;
>> > > >
>> > > > value = !!value;
>> > > > +
>> > > > + spin_lock_irqsave(hba->host->host_lock, flags);
>> > > > if (value == hba->clk_gating.is_enabled)
>> > > > goto out;
>> > > >
>> > > > - if (value) {
>> > > > - ufshcd_release(hba);
>> > > > - } else {
>> > > > - spin_lock_irqsave(hba->host->host_lock, flags);
>> > > > + if (value)
>> > > > + __ufshcd_release(hba);
>> > > > + else
>> > > > hba->clk_gating.active_reqs++;
>> > > > - spin_unlock_irqrestore(hba->host->host_lock, flags);
>> > > > - }
>> > > >
>> > > > hba->clk_gating.is_enabled = value;
>> > > > out:
>> > > > + spin_unlock_irqrestore(hba->host->host_lock, flags);
>> > > > return count;
>> > > > }