From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans de Goede Date: Wed, 25 Oct 2017 15:57:22 +0000 Subject: Re: [PATCH] iio/accel/bmc150: Improve unlocking of a mutex in two functions Message-Id: List-Id: References: <66d582a4-a77e-cd78-4215-49587ec2259e@users.sourceforge.net> In-Reply-To: <66d582a4-a77e-cd78-4215-49587ec2259e@users.sourceforge.net> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: SF Markus Elfring , linux-iio@vger.kernel.org, Hartmut Knaack , Jonathan Cameron , Lars-Peter Clausen , Srinivas Pandruvada Cc: LKML , kernel-janitors@vger.kernel.org Hi, On 25-10-17 16:33, SF Markus Elfring wrote: > From: Markus Elfring > Date: Wed, 25 Oct 2017 16:26:29 +0200 > > Add a jump target so that a call of the function "mutex_unlock" is mostly > stored at the end of these function implementations. > Replace five calls by goto statements. > > This issue was detected by using the Coccinelle software. > > Signed-off-by: Markus Elfring > --- > drivers/iio/accel/bmc150-accel-core.c | 32 ++++++++++++++------------------ > 1 file changed, 14 insertions(+), 18 deletions(-) > > diff --git a/drivers/iio/accel/bmc150-accel-core.c b/drivers/iio/accel/bmc150-accel-core.c > index 870f92ef61c2..f2a85a11a5e4 100644 > --- a/drivers/iio/accel/bmc150-accel-core.c > +++ b/drivers/iio/accel/bmc150-accel-core.c > @@ -554,18 +554,15 @@ static int bmc150_accel_get_axis(struct bmc150_accel_data *data, > > mutex_lock(&data->mutex); > ret = bmc150_accel_set_power_state(data, true); > - if (ret < 0) { > - mutex_unlock(&data->mutex); > - return ret; > - } > + if (ret < 0) > + goto unlock_after_failure; > > ret = regmap_bulk_read(data->regmap, BMC150_ACCEL_AXIS_TO_REG(axis), > &raw_val, sizeof(raw_val)); > if (ret < 0) { > dev_err(dev, "Error reading axis %d\n", axis); > bmc150_accel_set_power_state(data, false); > - mutex_unlock(&data->mutex); > - return ret; > + goto unlock_after_failure; > } > *val = sign_extend32(le16_to_cpu(raw_val) >> chan->scan_type.shift, > chan->scan_type.realbits - 1); > @@ -575,6 +572,10 @@ static int bmc150_accel_get_axis(struct bmc150_accel_data *data, > return ret; > > return IIO_VAL_INT; > + > +unlock_after_failure: > + mutex_unlock(&data->mutex); > + return ret; > } > > static int bmc150_accel_read_raw(struct iio_dev *indio_dev, IMHO, if you do this, you should rework the function so that there is a single unlock call at the end, not a separate one in in error label. Could e.g. change this: ret = bmc150_accel_set_power_state(data, false); mutex_unlock(&data->mutex); if (ret < 0) return ret; return IIO_VAL_INT; } To: ret = bmc150_accel_set_power_state(data, false); if (ret < 0) goto unlock; ret = IIO_VAL_INT; unlock: mutex_unlock(&data->mutex); return ret; } And also use the unlock label in the other cases, this is actually quite a normal pattern. I see little use in a patch like this if there are still 2 unlock paths after the patch. Regards, Hans > @@ -1170,28 +1171,23 @@ static int bmc150_accel_trigger_set_state(struct iio_trigger *trig, > mutex_lock(&data->mutex); > > if (t->enabled = state) { > - mutex_unlock(&data->mutex); > - return 0; > + ret = 0; > + goto unlock; > } > > if (t->setup) { > ret = t->setup(t, state); > - if (ret < 0) { > - mutex_unlock(&data->mutex); > - return ret; > - } > + if (ret < 0) > + goto unlock; > } > > ret = bmc150_accel_set_interrupt(data, t->intr, state); > - if (ret < 0) { > - mutex_unlock(&data->mutex); > - return ret; > - } > + if (ret < 0) > + goto unlock; > > t->enabled = state; > - > +unlock: > mutex_unlock(&data->mutex); > - > return ret; > } > >