Re: [PATCH v6 3/7] scsi: ufs: introduce common delay function
From: Stanley Chu
Date: Wed Mar 18 2020 - 02:14:21 EST
(Sorry to resend this mail with "[SPAM]" prefix removed in title)
Hi Bart,
On Mon, 2020-03-16 at 20:59 -0700, Bart Van Assche wrote:
> On 2020-03-16 17:13, Stanley Chu wrote:
> > On Mon, 2020-03-16 at 09:23 -0700, Bart Van Assche wrote:
> >> On 3/16/20 1:52 AM, Stanley Chu wrote:
> >>> +void ufshcd_wait_us(unsigned long us, unsigned long tolerance, bool can_sleep)
> >>> +{
> >>> + if (!us)
> >>> + return;
> >>> +
> >>> + if (us < 10 || !can_sleep)
> >>> + udelay(us);
> >>> + else
> >>> + usleep_range(us, us + tolerance);
> >>> +}
> >>> +EXPORT_SYMBOL_GPL(ufshcd_wait_us);
> >>
> >> I don't like this function because I think it makes the UFS code harder
> >> to read instead of easier. The 'can_sleep' argument is only set by one
> >> caller which I think is a strong argument to remove that argument again
> >> and to move the code that depends on that argument from the above
> >> function into the caller. Additionally, it is not possible to comprehend
> >> what a ufshcd_wait_us() call does without looking up the function
> >> definition to see what the meaning of the third argument is.
> >>
> >> Please drop this patch.
> >
> > Thanks for your review and comments.
> >
> > If the problem is the third argument 'can_sleep' which makes the code
> > not be easily comprehensible, how about just removing 'can_sleep' from
> > this function and keeping left parts because this function provides good
> > flexibility to users to choose udelay or usleep_range according to the
> > 'us' argument?
>
> Hi Stanley,
>
> I think that we need to get rid of 'can_sleep' across the entire UFS
> driver. As far as I can see the only context from which 'can_sleep' is
> set to true is ufshcd_host_reset_and_restore() and 'can_sleep' is set to
> true because ufshcd_hba_stop() is called with a spinlock held. Do you
> agree that it is wrong to call udelay() while holding a spinlock() and
> that doing so has a bad impact on the energy consumption of the UFS
> driver?
Thanks for your positive suggestion.
Indeed using udelay() with spinlock held may have performance or power
consumption concerns. However the concern in ufshcd_hba_stop() could be
ignored in most cases since the execution period of changing bit 0 in
REG_CONTROLLER_ENABLE from 1 to 0 shall be very fast. In my local
environment, it could have only several 'ns' latency thus udelay() was
never executed during the stress test. The delay here may be required
for rare cases that host is under an abnormal state.
> Has it already been considered to use another mechanism to
> serialize REG_CONTROLLER_ENABLE changes, e.g. a mutex?
I think mutex is not suitable for REG_CONTROLLER_ENABLE case because
stopping host (by what ufshcd_hba_stop does) will reset doorbell bits in
the same time by host, and those doorbell bits are looked up by UFS
interrupt routine for request completion flow as well.
I agree that "can_sleep" can be improved and may have other optimized
way but this is beyond this patch set. I would like to remove the
"can_sleep" related modification from this patch set first.
Thanks,
Stanley Chu