Message ID | 20240825051627.2848495-4-dmitry.torokhov@gmail.com |
---|---|
State | Handled Elsewhere |
Headers | show |
Series | Convert keyboard drivers to use new cleanup facilities | expand |
Hi, On 8/25/24 7:16 AM, Dmitry Torokhov wrote: > This makes the code more compact and error handling more robust > by ensuring that mutexes are released in all code paths when control > leaves critical section. > > Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Thanks, patch looks good to me: Reviewed-by: Hans de Goede <hdegoede@redhat.com> Regards, Hans > --- > drivers/input/keyboard/atkbd.c | 37 ++++++++++++++-------------------- > 1 file changed, 15 insertions(+), 22 deletions(-) > > diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c > index f4f2078cf501..5855d4fc6e6a 100644 > --- a/drivers/input/keyboard/atkbd.c > +++ b/drivers/input/keyboard/atkbd.c > @@ -639,7 +639,7 @@ static void atkbd_event_work(struct work_struct *work) > { > struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work); > > - mutex_lock(&atkbd->mutex); > + guard(mutex)(&atkbd->mutex); > > if (!atkbd->enabled) { > /* > @@ -657,8 +657,6 @@ static void atkbd_event_work(struct work_struct *work) > if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) > atkbd_set_repeat_rate(atkbd); > } > - > - mutex_unlock(&atkbd->mutex); > } > > /* > @@ -1361,7 +1359,7 @@ static int atkbd_reconnect(struct serio *serio) > { > struct atkbd *atkbd = atkbd_from_serio(serio); > struct serio_driver *drv = serio->drv; > - int retval = -1; > + int error; > > if (!atkbd || !drv) { > dev_dbg(&serio->dev, > @@ -1369,16 +1367,17 @@ static int atkbd_reconnect(struct serio *serio) > return -1; > } > > - mutex_lock(&atkbd->mutex); > + guard(mutex)(&atkbd->mutex); > > atkbd_disable(atkbd); > > if (atkbd->write) { > - if (atkbd_probe(atkbd)) > - goto out; > + error = atkbd_probe(atkbd); > + if (error) > + return error; > > if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra)) > - goto out; > + return -EIO; > > /* > * Restore LED state and repeat rate. While input core > @@ -1404,11 +1403,7 @@ static int atkbd_reconnect(struct serio *serio) > if (atkbd->write) > atkbd_activate(atkbd); > > - retval = 0; > - > - out: > - mutex_unlock(&atkbd->mutex); > - return retval; > + return 0; > } > > static const struct serio_device_id atkbd_serio_ids[] = { > @@ -1465,17 +1460,15 @@ static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t > struct atkbd *atkbd = atkbd_from_serio(serio); > int retval; > > - retval = mutex_lock_interruptible(&atkbd->mutex); > - if (retval) > - return retval; > + scoped_guard(mutex_intr, &atkbd->mutex) { > + atkbd_disable(atkbd); > + retval = handler(atkbd, buf, count); > + atkbd_enable(atkbd); > > - atkbd_disable(atkbd); > - retval = handler(atkbd, buf, count); > - atkbd_enable(atkbd); > - > - mutex_unlock(&atkbd->mutex); > + return retval; > + } > > - return retval; > + return -EINTR; > } > > static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf)
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index f4f2078cf501..5855d4fc6e6a 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c @@ -639,7 +639,7 @@ static void atkbd_event_work(struct work_struct *work) { struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work); - mutex_lock(&atkbd->mutex); + guard(mutex)(&atkbd->mutex); if (!atkbd->enabled) { /* @@ -657,8 +657,6 @@ static void atkbd_event_work(struct work_struct *work) if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) atkbd_set_repeat_rate(atkbd); } - - mutex_unlock(&atkbd->mutex); } /* @@ -1361,7 +1359,7 @@ static int atkbd_reconnect(struct serio *serio) { struct atkbd *atkbd = atkbd_from_serio(serio); struct serio_driver *drv = serio->drv; - int retval = -1; + int error; if (!atkbd || !drv) { dev_dbg(&serio->dev, @@ -1369,16 +1367,17 @@ static int atkbd_reconnect(struct serio *serio) return -1; } - mutex_lock(&atkbd->mutex); + guard(mutex)(&atkbd->mutex); atkbd_disable(atkbd); if (atkbd->write) { - if (atkbd_probe(atkbd)) - goto out; + error = atkbd_probe(atkbd); + if (error) + return error; if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra)) - goto out; + return -EIO; /* * Restore LED state and repeat rate. While input core @@ -1404,11 +1403,7 @@ static int atkbd_reconnect(struct serio *serio) if (atkbd->write) atkbd_activate(atkbd); - retval = 0; - - out: - mutex_unlock(&atkbd->mutex); - return retval; + return 0; } static const struct serio_device_id atkbd_serio_ids[] = { @@ -1465,17 +1460,15 @@ static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t struct atkbd *atkbd = atkbd_from_serio(serio); int retval; - retval = mutex_lock_interruptible(&atkbd->mutex); - if (retval) - return retval; + scoped_guard(mutex_intr, &atkbd->mutex) { + atkbd_disable(atkbd); + retval = handler(atkbd, buf, count); + atkbd_enable(atkbd); - atkbd_disable(atkbd); - retval = handler(atkbd, buf, count); - atkbd_enable(atkbd); - - mutex_unlock(&atkbd->mutex); + return retval; + } - return retval; + return -EINTR; } static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf)
This makes the code more compact and error handling more robust by ensuring that mutexes are released in all code paths when control leaves critical section. Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> --- drivers/input/keyboard/atkbd.c | 37 ++++++++++++++-------------------- 1 file changed, 15 insertions(+), 22 deletions(-)