Message ID | 5e5813b9.1c69fb81.e3d1a.5426@mx.google.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [v2] iio: adc: max1363: replace mlock with own lock | expand |
+CC Jonathan and Alexandru
On Fri, 2020-02-28 at 00:38 +0530, Rohit Sarkar wrote: > This change replaces indio_dev's mlock with the drivers own lock. In > each case the lock is needed to protect the driver's own state. > > Changes from v1: > Fix indentation. > Add a mutex_init() in the probe function. > This looks like the first patch. I don't see the code changes from the first one. > Signed-off-by: Rohit Sarkar <rohitsarkar5398@gmail.com> > --- > drivers/iio/adc/max1363.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/drivers/iio/adc/max1363.c b/drivers/iio/adc/max1363.c > index 5c2cc61b666e..b9557f957f3c 100644 > --- a/drivers/iio/adc/max1363.c > +++ b/drivers/iio/adc/max1363.c > @@ -169,6 +169,7 @@ struct max1363_state { > const struct max1363_mode *current_mode; > u32 requestedmask; > struct regulator *reg; > + struct mutex lock; > > /* Using monitor modes and buffer at the same time is > currently not supported */ > @@ -364,7 +365,7 @@ static int max1363_read_single_chan(struct iio_dev > *indio_dev, > struct max1363_state *st = iio_priv(indio_dev); > struct i2c_client *client = st->client; > > - mutex_lock(&indio_dev->mlock); > + mutex_lock(&st->lock); > /* > * If monitor mode is enabled, the method for reading a single > * channel will have to be rather different and has not yet > @@ -405,7 +406,7 @@ static int max1363_read_single_chan(struct iio_dev > *indio_dev, > } > *val = data; > error_ret: > - mutex_unlock(&indio_dev->mlock); > + mutex_unlock(&st->lock); > return ret; > > } > @@ -705,9 +706,9 @@ static ssize_t max1363_monitor_store_freq(struct device > *dev, > if (!found) > return -EINVAL; > > - mutex_lock(&indio_dev->mlock); > + mutex_lock(&st->mlock); > st->monitor_speed = i; > - mutex_unlock(&indio_dev->mlock); > + mutex_unlock(&st->mlock); > > return 0; > } > @@ -810,12 +811,12 @@ static int max1363_read_event_config(struct iio_dev > *indio_dev, > int val; > int number = chan->channel; > > - mutex_lock(&indio_dev->mlock); > + mutex_lock(&st->mlock); > if (dir == IIO_EV_DIR_FALLING) > val = (1 << number) & st->mask_low; > else > val = (1 << number) & st->mask_high; > - mutex_unlock(&indio_dev->mlock); > + mutex_unlock(&st->mlock); > > return val; > }
On Fri, 28 Feb 2020 00:38:37 +0530 Rohit Sarkar <rohitsarkar5398@gmail.com> wrote: > This change replaces indio_dev's mlock with the drivers own lock. In > each case the lock is needed to protect the driver's own state. > > Changes from v1: > Fix indentation. > Add a mutex_init() in the probe function. > > Signed-off-by: Rohit Sarkar <rohitsarkar5398@gmail.com> Worth taking into account that perhaps some of the mlock cases aren't actually taking it for local purposes, but rather to explicitly stop the core from changing between buffered and polled modes (chrdev and sysfs access). > --- > drivers/iio/adc/max1363.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/drivers/iio/adc/max1363.c b/drivers/iio/adc/max1363.c > index 5c2cc61b666e..b9557f957f3c 100644 > --- a/drivers/iio/adc/max1363.c > +++ b/drivers/iio/adc/max1363.c > @@ -169,6 +169,7 @@ struct max1363_state { > const struct max1363_mode *current_mode; > u32 requestedmask; > struct regulator *reg; > + struct mutex lock; Scope of locks (what they protect) should always be described. So please add documentation explaining exactly what this is protecting. > > /* Using monitor modes and buffer at the same time is > currently not supported */ > @@ -364,7 +365,7 @@ static int max1363_read_single_chan(struct iio_dev *indio_dev, > struct max1363_state *st = iio_priv(indio_dev); > struct i2c_client *client = st->client; > > - mutex_lock(&indio_dev->mlock); > + mutex_lock(&st->lock); This one is actually about preventing state changes. So it shouldn't be directly accessing the lock, but it should be calling iio_device_claim_direct_mode. Take a look at what else that function does. For this driver things are more complex than normal though as we need to prevent either switching between polled and buffer mode or trying to sample with the monitor running. Hence we may also need to take the local lock to protect the monitor_mode flag. > /* > * If monitor mode is enabled, the method for reading a single > * channel will have to be rather different and has not yet > @@ -405,7 +406,7 @@ static int max1363_read_single_chan(struct iio_dev *indio_dev, > } > *val = data; > error_ret: > - mutex_unlock(&indio_dev->mlock); > + mutex_unlock(&st->lock); > return ret; > > } > @@ -705,9 +706,9 @@ static ssize_t max1363_monitor_store_freq(struct device *dev, > if (!found) > return -EINVAL; > > - mutex_lock(&indio_dev->mlock); > + mutex_lock(&st->mlock); > st->monitor_speed = i; > - mutex_unlock(&indio_dev->mlock); > + mutex_unlock(&st->mlock); > > return 0; > } > @@ -810,12 +811,12 @@ static int max1363_read_event_config(struct iio_dev *indio_dev, > int val; > int number = chan->channel; > > - mutex_lock(&indio_dev->mlock); > + mutex_lock(&st->mlock); > if (dir == IIO_EV_DIR_FALLING) > val = (1 << number) & st->mask_low; > else > val = (1 << number) & st->mask_high; > - mutex_unlock(&indio_dev->mlock); > + mutex_unlock(&st->mlock); > > return val; > } Nothing for write_event_config? That has the same problem that it should only be possible to change monitor mode if we aren't running in buffered mode. Hence it should try to claim direct mode and if it fails return an error. Fiddly stuff :) Thanks, Jonathan
On Fri, Feb 28, 2020 at 07:56:14AM +0000, Ardelean, Alexandru wrote: > On Fri, 2020-02-28 at 00:38 +0530, Rohit Sarkar wrote: > > This change replaces indio_dev's mlock with the drivers own lock. In > > each case the lock is needed to protect the driver's own state. > > > > Changes from v1: > > Fix indentation. > > Add a mutex_init() in the probe function. > > > > This looks like the first patch. > I don't see the code changes from the first one. > I messed up sorry. Sent out v2 again. Thanks, Rohit
diff --git a/drivers/iio/adc/max1363.c b/drivers/iio/adc/max1363.c index 5c2cc61b666e..b9557f957f3c 100644 --- a/drivers/iio/adc/max1363.c +++ b/drivers/iio/adc/max1363.c @@ -169,6 +169,7 @@ struct max1363_state { const struct max1363_mode *current_mode; u32 requestedmask; struct regulator *reg; + struct mutex lock; /* Using monitor modes and buffer at the same time is currently not supported */ @@ -364,7 +365,7 @@ static int max1363_read_single_chan(struct iio_dev *indio_dev, struct max1363_state *st = iio_priv(indio_dev); struct i2c_client *client = st->client; - mutex_lock(&indio_dev->mlock); + mutex_lock(&st->lock); /* * If monitor mode is enabled, the method for reading a single * channel will have to be rather different and has not yet @@ -405,7 +406,7 @@ static int max1363_read_single_chan(struct iio_dev *indio_dev, } *val = data; error_ret: - mutex_unlock(&indio_dev->mlock); + mutex_unlock(&st->lock); return ret; } @@ -705,9 +706,9 @@ static ssize_t max1363_monitor_store_freq(struct device *dev, if (!found) return -EINVAL; - mutex_lock(&indio_dev->mlock); + mutex_lock(&st->mlock); st->monitor_speed = i; - mutex_unlock(&indio_dev->mlock); + mutex_unlock(&st->mlock); return 0; } @@ -810,12 +811,12 @@ static int max1363_read_event_config(struct iio_dev *indio_dev, int val; int number = chan->channel; - mutex_lock(&indio_dev->mlock); + mutex_lock(&st->mlock); if (dir == IIO_EV_DIR_FALLING) val = (1 << number) & st->mask_low; else val = (1 << number) & st->mask_high; - mutex_unlock(&indio_dev->mlock); + mutex_unlock(&st->mlock); return val; }
This change replaces indio_dev's mlock with the drivers own lock. In each case the lock is needed to protect the driver's own state. Changes from v1: Fix indentation. Add a mutex_init() in the probe function. Signed-off-by: Rohit Sarkar <rohitsarkar5398@gmail.com> --- drivers/iio/adc/max1363.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)