Re: [PATCH RFC] iio: pressure: zpa2326: report interrupted case as failure

From: Jonathan Cameron
Date: Wed Jul 05 2017 - 06:07:25 EST


On Wed, 5 Jul 2017 08:55:47 +0000
Nicholas Mc Guire <der.herr@xxxxxxx> wrote:

> On Wed, Jul 05, 2017 at 10:02:17AM +0200, Geert Uytterhoeven wrote:
> > Hi Nicholas,
> >
> > On Wed, Jul 5, 2017 at 9:37 AM, Nicholas Mc Guire
> > <der.herr@xxxxxxx> wrote:
> > > On Tue, Jul 04, 2017 at 08:08:53PM +0100, Jonathan Cameron
> > > wrote:
> > >> On Tue, 4 Jul 2017 12:40:33 +0200
> > >> Geert Uytterhoeven <geert@xxxxxxxxxxxxxx> wrote:
> > >> > On Sun, May 14, 2017 at 10:43 AM, Nicholas Mc Guire
> > >> > <der.herr@xxxxxxx> wrote:
> > >> > > If the timeout-case prints a warning message then probably
> > >> > > the interrupted case should also. Further,
> > >> > > wait_for_completion_interruptible_timeout() returns long not
> > >> > > int.
> > >> > >
> > >> > > Fixes: commit 03b262f2bbf4 ("iio:pressure: initial zpa2326
> > >> > > barometer support") Signed-off-by: Nicholas Mc Guire
> > >> > > <der.herr@xxxxxxx> ---
> > >> > >
> > >> > > The original control-flow was technically not wrong just
> > >> > > confusing and a bit complicated. Not clear if reporting the
> > >> > > interrupted case actually is useful, but given that the
> > >> > > timeout is relatively long (200ms) it is not that unlikely
> > >> > > so differentiating the cases seems helpful.
> > >> > >
> > >> > > Patch was compile-tested with: x86_64_defconfig +
> > >> > > CONFIG_IIO=m, CONFIG_ZPA2326=m
> > >> > >
> > >> > > Patch is against v4.11 (localversion-next is next-20170512)
> > >> > >
> > >> > > drivers/iio/pressure/zpa2326.c | 17 ++++++++++-------
> > >> > > 1 file changed, 10 insertions(+), 7 deletions(-)
> > >> > >
> > >> > > diff --git a/drivers/iio/pressure/zpa2326.c
> > >> > > b/drivers/iio/pressure/zpa2326.c index e58a0ad..617926f
> > >> > > 100644 --- a/drivers/iio/pressure/zpa2326.c
> > >> > > +++ b/drivers/iio/pressure/zpa2326.c
> > >> > > @@ -867,12 +867,13 @@ static int
> > >> > > zpa2326_wait_oneshot_completion(const struct iio_dev
> > >> > > *indio_dev, { int ret;
> > >> > > unsigned int val;
> > >> > > + long timeout;
> > >> > >
> > >> > > zpa2326_dbg(indio_dev, "waiting for one shot
> > >> > > completion interrupt");
> > >> > >
> > >> > > - ret = wait_for_completion_interruptible_timeout(
> > >> > > + timeout = wait_for_completion_interruptible_timeout(
> > >> > > &private->data_ready,
> > >> > > ZPA2326_CONVERSION_JIFFIES);
> > >> > > - if (ret > 0)
> > >> > > + if (timeout > 0)
> > >> >
> > >> > Check for strict positive timeout.
> > >> >
> > >> > > /*
> > >> > > * Interrupt handler completed before
> > >> > > timeout: return operation
> > >> > > * status.
> > >> > > @@ -882,13 +883,15 @@ static int
> > >> > > zpa2326_wait_oneshot_completion(const struct iio_dev
> > >> > > *indio_dev, /* Clear all interrupts just to be sure. */
> > >> > > regmap_read(private->regmap, ZPA2326_INT_SOURCE_REG, &val);
> > >> > >
> > >> > > - if (!ret)
> > >> > > + if (!timeout) {
> > >> >
> > >> > Check for zero timeout.
> > >> >
> > >> > > /* Timed out. */
> > >> > > + zpa2326_warn(indio_dev, "no one shot
> > >> > > interrupt occurred (%ld)",
> > >> > > + timeout);
> > >> > > ret = -ETIME;
> > >> > > -
> > >> > > - if (ret != -ERESTARTSYS)
> > >> > > - zpa2326_warn(indio_dev, "no one shot
> > >> > > interrupt occurred (%d)",
> > >> > > - ret);
> > >> > > + } else if (timeout < 0) {
> > >> >
> > >> > So if we get here, timeout is always strict negative, so the
> > >> > check can be removed.
> > >> >
> > >> > > + zpa2326_warn(indio_dev, "wait for one shot
> > >> > > interrupt canceled");
> > >> > > + ret = -ERESTARTSYS;
> > >> > > + }
> > >> > >
> > >> > > return ret;
> > >> >
> > >> > But gcc-4.1.2 is not smart enough:
> > >> >
> > >> > drivers/iio/pressure/zpa2326.c:868: warning: ???ret??? may be
> > >> > used uninitialized in this function
> > >> Good analysis. Care to send the obvious patch?
> > >>
> > > Thanks Geert for finding that - yes ret needs to be
> > > initialized to 0 here, success case as documented in
> > > the header of zpa2326_wait_oneshot_completion -
> >
> > No, ret does not need to be initialized to 0, as it would prevent
> > the warning from reappearing in case of future logic errors.
> >
> > Instead the last "if" should be removed, as it's always true.
> > Will send a patch, as requested by Jonathan.
> >
> hmm... the if can be removed but then it would be two return
> statements and one could simply drop ret all together
>
> if (!timeout) {
> /* Timed out. */
> zpa2326_warn(indio_dev, "no one shot interrupt
> occurred (%ld)", timeout);
> return -ETIME;
> }
> zpa2326_warn(indio_dev, "wait for one shot interrupt
> cancelled"); return -ERESTARTSYS
>
> but I assumed that kernel code should try to not end up
> with too many exit points, in which case the if is needed
> and the warning could be elimnated by initializing ret to 0
> even if that is more or less usless.
Usual rule of thumb for kernel style is that if you have cleanup to
do (releasing locks etc) then it should be done at a common location.
If there is no cleanup then you should return directly.

Jonathan
>
> > > interestingly enough gcc gcc (Debian 4.9.2-10) 4.9.2
> > > does not flag this uninitioalized variable !
> >
> > Only very old or very new versions of gcc do that.
> >
> thanks - so I need to upgrad my gcc as the compile-checking
> will fail to catch uninitilized vars then, atleast in
> some cases.
>
> thx!
> hofrat
> --
> To unsubscribe from this list: send the line "unsubscribe linux-iio"
> in the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html