Re: [PATCH 4.19 189/276] iio: adc: ti-ads7950: Fix improper use of mlock

From: Jonathan Cameron
Date: Thu Jun 06 2019 - 11:01:02 EST


On Thu, 6 Jun 2019 15:13:00 +0200
Pavel Machek <pavel@xxxxxx> wrote:

> (stable removed from cc list)
>
> > Indio->mlock is used for protecting the different iio device modes.
> > It is currently not being used in this way. Replace the lock with
> > an internal lock specifically used for protecting the SPI transfer
> > buffer.
> >
> > Signed-off-by: Justin Chen <justinpopo6@xxxxxxxxx>
> > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx>
> > Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>
> > ---
> > drivers/iio/adc/ti-ads7950.c | 19 +++++++++++++++----
> > 1 file changed, 15 insertions(+), 4 deletions(-)
> >
>
> > @@ -277,6 +280,7 @@ static irqreturn_t ti_ads7950_trigger_handler(int irq, void *p)
> > struct ti_ads7950_state *st = iio_priv(indio_dev);
> > int ret;
> >
> > + mutex_lock(&st->slock);
> > ret = spi_sync(st->spi, &st->ring_msg);
> > if (ret < 0)
> > goto out;
> > @@ -285,6 +289,7 @@ static irqreturn_t ti_ads7950_trigger_handler(int irq, void *p)
> > iio_get_time_ns(indio_dev));
> >
> > out:
> > + mutex_unlock(&st->slock);
> > iio_trigger_notify_done(indio_dev->trig);
> >
> > return IRQ_HANDLED;
>
> Does trigger_handler run from interrupt context? Prototype suggests
> so... If so, it can not really take mutexes...

It's an interrupt thread so taking mutexes should be fine.
For this particular case there is no 'top half' provided to
the call to iio_triggered_buffer_setup so nothing runs in interrupt context.

The spi_sync call can sleep anyway so this code can only run where
sleeping is fine.

Thanks,

Jonathan


>
> Best regards,
> Pavel
>