From: "David Rheinsberg" <david@readahead.eu>
To: "Rafael Passos" <rafael@rcpassos.me>,
"Jiri Kosina" <jikos@kernel.org>,
"Benjamin Tissoires" <bentiss@kernel.org>
Cc: "Shuah Khan" <skhan@linuxfoundation.org>,
"Brigham Campbell" <me@brighamcampbell.com>,
"Jori Koolstra" <jkoolstra@xs4all.nl>,
linux-input@vger.kernel.org
Subject: Re: [PATCH v3 2/4] HID: wiimote: replace spinlock pairs with scoped_guard
Date: Fri, 31 Jul 2026 11:08:28 +0200 [thread overview]
Message-ID: <52967401-e1b0-4c47-a00d-b53d238641d0@app.fastmail.com> (raw)
In-Reply-To: <20260729164928.1138468-3-rafael@rcpassos.me>
Hi
On Wed, Jul 29, 2026, at 6:49 PM, Rafael Passos wrote:
> Cleanup code replacing manual lock/unlock with scoped guards.
> This does not change any behavior, but makes it safer to modify.
>
> The multi line spinlock blocks were replaced by braced scoped_guard,
> and one-liners by a scoped_guard without braces nor indentation.
>
> There are two cases left in this driver using lock/unlock, because
> guard would make the code more complex than current implementation.
>
> Signed-off-by: Rafael Passos <rafael@rcpassos.me>
Reviewed-by: David Rheinsberg <david@readahead.eu>
This looks good! Thanks a lot!
David
> ---
> drivers/hid/hid-wiimote-core.c | 224 +++++++++++++-----------------
> drivers/hid/hid-wiimote-debug.c | 50 +++----
> drivers/hid/hid-wiimote-modules.c | 7 +-
> 3 files changed, 121 insertions(+), 160 deletions(-)
>
> diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c
> index 48830f2ffcb50..762b3c383194e 100644
> --- a/drivers/hid/hid-wiimote-core.c
> +++ b/drivers/hid/hid-wiimote-core.c
> @@ -7,6 +7,7 @@
> /*
> */
>
> +#include <linux/cleanup.h>
> #include <linux/completion.h>
> #include <linux/device.h>
> #include <linux/hid.h>
> @@ -362,13 +363,12 @@ void wiiproto_req_rmem(struct wiimote_data
> *wdata, bool eeprom, __u32 offset,
> int wiimote_cmd_write(struct wiimote_data *wdata, __u32 offset,
> const __u8 *wmem, __u8 size)
> {
> - unsigned long flags;
> int ret;
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wiimote_cmd_set(wdata, WIIPROTO_REQ_WMEM, 0);
> - wiiproto_req_wreg(wdata, offset, wmem, size);
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock) {
> + wiimote_cmd_set(wdata, WIIPROTO_REQ_WMEM, 0);
> + wiiproto_req_wreg(wdata, offset, wmem, size);
> + }
>
> ret = wiimote_cmd_wait(wdata);
> if (!ret && wdata->state.cmd_err)
> @@ -381,21 +381,19 @@ int wiimote_cmd_write(struct wiimote_data *wdata,
> __u32 offset,
> ssize_t wiimote_cmd_read(struct wiimote_data *wdata, __u32 offset,
> __u8 *rmem,
> __u8 size)
> {
> - unsigned long flags;
> ssize_t ret;
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wdata->state.cmd_read_size = size;
> - wdata->state.cmd_read_buf = rmem;
> - wiimote_cmd_set(wdata, WIIPROTO_REQ_RMEM, offset & 0xffff);
> - wiiproto_req_rreg(wdata, offset, size);
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock) {
> + wdata->state.cmd_read_size = size;
> + wdata->state.cmd_read_buf = rmem;
> + wiimote_cmd_set(wdata, WIIPROTO_REQ_RMEM, offset & 0xffff);
> + wiiproto_req_rreg(wdata, offset, size);
> + }
>
> ret = wiimote_cmd_wait(wdata);
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wdata->state.cmd_read_buf = NULL;
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock)
> + wdata->state.cmd_read_buf = NULL;
>
> if (!ret) {
> if (wdata->state.cmd_read_size == 0)
> @@ -675,11 +673,8 @@ static void wiimote_modules_load(struct
> wiimote_data *wdata,
> goto error;
> }
>
> - spin_lock_irq(&wdata->state.lock);
> - wdata->state.devtype = devtype;
> - spin_unlock_irq(&wdata->state.lock);
> -
> scoped_guard(spinlock_irqsave, &wdata->state.lock) {
> + wdata->state.devtype = devtype;
> /* after loading modules, set the Player ID LED cycling from 1 to 4*/
> wiiproto_req_leds(wdata, player_leds[(wdata->player_id - 1) % 4]);
> }
> @@ -703,13 +698,11 @@ static void wiimote_modules_unload(struct
> wiimote_data *wdata)
> {
> const __u8 *mods, *iter;
> const struct wiimod_ops *ops;
> - unsigned long flags;
>
> mods = wiimote_devtype_mods[wdata->state.devtype];
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wdata->state.devtype = WIIMOTE_DEV_UNKNOWN;
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock)
> + wdata->state.devtype = WIIMOTE_DEV_UNKNOWN;
>
> /* find end of list */
> for (iter = mods; *iter != WIIMOD_NULL; ++iter)
> @@ -736,7 +729,6 @@ static void wiimote_modules_unload(struct
> wiimote_data *wdata)
>
> static void wiimote_ext_load(struct wiimote_data *wdata, unsigned int ext)
> {
> - unsigned long flags;
> const struct wiimod_ops *ops;
> int ret;
>
> @@ -748,22 +740,20 @@ static void wiimote_ext_load(struct wiimote_data
> *wdata, unsigned int ext)
> ext = WIIMOTE_EXT_UNKNOWN;
> }
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wdata->state.exttype = ext;
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock)
> + wdata->state.exttype = ext;
> }
>
> static void wiimote_ext_unload(struct wiimote_data *wdata)
> {
> - unsigned long flags;
> const struct wiimod_ops *ops;
>
> ops = wiimod_ext_table[wdata->state.exttype];
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wdata->state.exttype = WIIMOTE_EXT_UNKNOWN;
> - wdata->state.flags &= ~WIIPROTO_FLAG_EXT_USED;
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock) {
> + wdata->state.exttype = WIIMOTE_EXT_UNKNOWN;
> + wdata->state.flags &= ~WIIPROTO_FLAG_EXT_USED;
> + }
>
> if (ops->remove)
> ops->remove(ops, wdata);
> @@ -771,7 +761,6 @@ static void wiimote_ext_unload(struct wiimote_data *wdata)
>
> static void wiimote_mp_load(struct wiimote_data *wdata)
> {
> - unsigned long flags;
> const struct wiimod_ops *ops;
> int ret;
> __u8 mode = 2;
> @@ -783,14 +772,12 @@ static void wiimote_mp_load(struct wiimote_data *wdata)
> mode = 1;
> }
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wdata->state.mp = mode;
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock)
> + wdata->state.mp = mode;
> }
>
> static void wiimote_mp_unload(struct wiimote_data *wdata)
> {
> - unsigned long flags;
> const struct wiimod_ops *ops;
>
> if (wdata->state.mp < 2)
> @@ -798,10 +785,10 @@ static void wiimote_mp_unload(struct wiimote_data *wdata)
>
> ops = &wiimod_mp;
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wdata->state.mp = 0;
> - wdata->state.flags &= ~WIIPROTO_FLAG_MP_USED;
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock) {
> + wdata->state.mp = 0;
> + wdata->state.flags &= ~WIIPROTO_FLAG_MP_USED;
> + }
>
> if (ops->remove)
> ops->remove(ops, wdata);
> @@ -885,19 +872,19 @@ static void wiimote_init_detect(struct
> wiimote_data *wdata)
>
> wiimote_cmd_acquire_noint(wdata);
>
> - spin_lock_irq(&wdata->state.lock);
> - wdata->state.devtype = WIIMOTE_DEV_UNKNOWN;
> - wiimote_cmd_set(wdata, WIIPROTO_REQ_SREQ, 0);
> - wiiproto_req_status(wdata);
> - spin_unlock_irq(&wdata->state.lock);
> + scoped_guard(spinlock_irq, &wdata->state.lock) {
> + wdata->state.devtype = WIIMOTE_DEV_UNKNOWN;
> + wiimote_cmd_set(wdata, WIIPROTO_REQ_SREQ, 0);
> + wiiproto_req_status(wdata);
> + }
> +
>
> ret = wiimote_cmd_wait_noint(wdata);
> if (ret)
> goto out_release;
>
> - spin_lock_irq(&wdata->state.lock);
> - ext = wdata->state.flags & WIIPROTO_FLAG_EXT_PLUGGED;
> - spin_unlock_irq(&wdata->state.lock);
> + scoped_guard(spinlock_irq, &wdata->state.lock)
> + ext = wdata->state.flags & WIIPROTO_FLAG_EXT_PLUGGED;
>
> if (!ext)
> goto out_release;
> @@ -910,11 +897,11 @@ static void wiimote_init_detect(struct
> wiimote_data *wdata)
> wiimote_init_set_type(wdata, exttype);
>
> /* schedule MP timer */
> - spin_lock_irq(&wdata->state.lock);
> - if (!(wdata->state.flags & WIIPROTO_FLAG_BUILTIN_MP) &&
> - !(wdata->state.flags & WIIPROTO_FLAG_NO_MP))
> - mod_timer(&wdata->timer, jiffies + HZ * 4);
> - spin_unlock_irq(&wdata->state.lock);
> + scoped_guard(spinlock_irq, &wdata->state.lock) {
> + if (!(wdata->state.flags & WIIPROTO_FLAG_BUILTIN_MP) &&
> + !(wdata->state.flags & WIIPROTO_FLAG_NO_MP))
> + mod_timer(&wdata->timer, jiffies + HZ * 4);
> + }
> }
>
> /*
> @@ -962,9 +949,8 @@ static bool wiimote_init_check(struct wiimote_data *wdata)
> __u8 type, data[6];
> bool ret, poll_mp;
>
> - spin_lock_irq(&wdata->state.lock);
> - flags = wdata->state.flags;
> - spin_unlock_irq(&wdata->state.lock);
> + scoped_guard(spinlock_irq, &wdata->state.lock)
> + flags = wdata->state.flags;
>
> wiimote_cmd_acquire_noint(wdata);
>
> @@ -980,11 +966,11 @@ static bool wiimote_init_check(struct wiimote_data *wdata)
> type = wiimote_cmd_read_mp_mapped(wdata);
> ret = type == WIIMOTE_MP_SINGLE;
>
> - spin_lock_irq(&wdata->state.lock);
> - ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_EXT_ACTIVE);
> - ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_MP_PLUGGED);
> - ret = ret && (wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE);
> - spin_unlock_irq(&wdata->state.lock);
> + scoped_guard(spinlock_irq, &wdata->state.lock) {
> + ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_EXT_ACTIVE);
> + ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_MP_PLUGGED);
> + ret = ret && (wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE);
> + }
>
> if (!ret)
> hid_dbg(wdata->hdev, "state left: !EXT && MP\n");
> @@ -1005,10 +991,10 @@ static bool wiimote_init_check(struct
> wiimote_data *wdata)
> type = wiimote_cmd_read_ext(wdata, data);
> ret = type == wdata->state.exttype;
>
> - spin_lock_irq(&wdata->state.lock);
> - ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE);
> - ret = ret && (wdata->state.flags & WIIPROTO_FLAG_EXT_ACTIVE);
> - spin_unlock_irq(&wdata->state.lock);
> + scoped_guard(spinlock_irq, &wdata->state.lock) {
> + ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE);
> + ret = ret && (wdata->state.flags & WIIPROTO_FLAG_EXT_ACTIVE);
> + }
>
> if (!ret)
> hid_dbg(wdata->hdev, "state left: EXT && !MP\n");
> @@ -1031,11 +1017,11 @@ static bool wiimote_init_check(struct
> wiimote_data *wdata)
> type = wiimote_cmd_read_ext(wdata, data);
> ret = type == wdata->state.exttype;
>
> - spin_lock_irq(&wdata->state.lock);
> - ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_EXT_ACTIVE);
> - ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE);
> - ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_EXT_PLUGGED);
> - spin_unlock_irq(&wdata->state.lock);
> + scoped_guard(spinlock_irq, &wdata->state.lock) {
> + ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_EXT_ACTIVE);
> + ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE);
> + ret = ret && !(wdata->state.flags & WIIPROTO_FLAG_EXT_PLUGGED);
> + }
>
> if (!ret)
> hid_dbg(wdata->hdev, "state left: !EXT && !MP\n");
> @@ -1061,11 +1047,11 @@ static bool wiimote_init_check(struct
> wiimote_data *wdata)
> ret = ret && type != WIIMOTE_MP_UNKNOWN;
> ret = ret && type != WIIMOTE_MP_SINGLE;
>
> - spin_lock_irq(&wdata->state.lock);
> - ret = ret && (wdata->state.flags & WIIPROTO_FLAG_EXT_PLUGGED);
> - ret = ret && (wdata->state.flags & WIIPROTO_FLAG_EXT_ACTIVE);
> - ret = ret && (wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE);
> - spin_unlock_irq(&wdata->state.lock);
> + scoped_guard(spinlock_irq, &wdata->state.lock) {
> + ret = ret && (wdata->state.flags & WIIPROTO_FLAG_EXT_PLUGGED);
> + ret = ret && (wdata->state.flags & WIIPROTO_FLAG_EXT_ACTIVE);
> + ret = ret && (wdata->state.flags & WIIPROTO_FLAG_MP_ACTIVE);
> + }
>
> if (!ret)
> hid_dbg(wdata->hdev, "state left: EXT && MP\n");
> @@ -1120,16 +1106,15 @@ static void wiimote_init_hotplug(struct
> wiimote_data *wdata)
>
> wiimote_cmd_acquire_noint(wdata);
>
> - spin_lock_irq(&wdata->state.lock);
> + scoped_guard(spinlock_irq, &wdata->state.lock) {
>
> - /* get state snapshot that we will then work on */
> - flags = wdata->state.flags;
> + /* get state snapshot that we will then work on */
> + flags = wdata->state.flags;
>
> - /* disable event forwarding temporarily */
> - wdata->state.flags &= ~WIIPROTO_FLAG_EXT_ACTIVE;
> - wdata->state.flags &= ~WIIPROTO_FLAG_MP_ACTIVE;
> -
> - spin_unlock_irq(&wdata->state.lock);
> + /* disable event forwarding temporarily */
> + wdata->state.flags &= ~WIIPROTO_FLAG_EXT_ACTIVE;
> + wdata->state.flags &= ~WIIPROTO_FLAG_MP_ACTIVE;
> + }
>
> /* init extension and MP (deactivates current extension or MP) */
> wiimote_cmd_init_ext(wdata);
> @@ -1152,9 +1137,8 @@ static void wiimote_init_hotplug(struct
> wiimote_data *wdata)
> hid_info(wdata->hdev, "cannot detect extension; %6phC\n",
> extdata);
> } else if (exttype == WIIMOTE_EXT_NONE) {
> - spin_lock_irq(&wdata->state.lock);
> - wdata->state.exttype = WIIMOTE_EXT_NONE;
> - spin_unlock_irq(&wdata->state.lock);
> + scoped_guard(spinlock_irq, &wdata->state.lock)
> + wdata->state.exttype = WIIMOTE_EXT_NONE;
> } else {
> hid_info(wdata->hdev, "detected extension: %s\n",
> wiimote_exttype_names[exttype]);
> @@ -1192,28 +1176,26 @@ static void wiimote_init_hotplug(struct
> wiimote_data *wdata)
> mod_timer(&wdata->timer, jiffies + HZ * 4);
> }
>
> - spin_lock_irq(&wdata->state.lock);
> -
> - /* enable data forwarding again and set expected hotplug state */
> - if (mp) {
> - wdata->state.flags |= WIIPROTO_FLAG_MP_ACTIVE;
> - if (wdata->state.exttype == WIIMOTE_EXT_NONE) {
> - wdata->state.flags &= ~WIIPROTO_FLAG_EXT_PLUGGED;
> - wdata->state.flags &= ~WIIPROTO_FLAG_MP_PLUGGED;
> - } else {
> - wdata->state.flags &= ~WIIPROTO_FLAG_EXT_PLUGGED;
> - wdata->state.flags |= WIIPROTO_FLAG_MP_PLUGGED;
> + scoped_guard(spinlock_irq, &wdata->state.lock) {
> + /* enable data forwarding again and set expected hotplug state */
> + if (mp) {
> + wdata->state.flags |= WIIPROTO_FLAG_MP_ACTIVE;
> + if (wdata->state.exttype == WIIMOTE_EXT_NONE) {
> + wdata->state.flags &= ~WIIPROTO_FLAG_EXT_PLUGGED;
> + wdata->state.flags &= ~WIIPROTO_FLAG_MP_PLUGGED;
> + } else {
> + wdata->state.flags &= ~WIIPROTO_FLAG_EXT_PLUGGED;
> + wdata->state.flags |= WIIPROTO_FLAG_MP_PLUGGED;
> + wdata->state.flags |= WIIPROTO_FLAG_EXT_ACTIVE;
> + }
> + } else if (wdata->state.exttype != WIIMOTE_EXT_NONE) {
> wdata->state.flags |= WIIPROTO_FLAG_EXT_ACTIVE;
> }
> - } else if (wdata->state.exttype != WIIMOTE_EXT_NONE) {
> - wdata->state.flags |= WIIPROTO_FLAG_EXT_ACTIVE;
> +
> + /* request status report for hotplug state updates */
> + wiiproto_req_status(wdata);
> }
>
> - /* request status report for hotplug state updates */
> - wiiproto_req_status(wdata);
> -
> - spin_unlock_irq(&wdata->state.lock);
> -
> hid_dbg(wdata->hdev, "detected extensions: MP: %d EXT: %d\n",
> wdata->state.mp, wdata->state.exttype);
> }
> @@ -1244,11 +1226,8 @@ void __wiimote_schedule(struct wiimote_data *wdata)
>
> static void wiimote_schedule(struct wiimote_data *wdata)
> {
> - unsigned long flags;
> -
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - __wiimote_schedule(wdata);
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock)
> + __wiimote_schedule(wdata);
> }
>
> static void wiimote_init_timeout(struct timer_list *t)
> @@ -1638,7 +1617,6 @@ static int wiimote_hid_event(struct hid_device
> *hdev, struct hid_report *report,
> struct wiimote_data *wdata = hid_get_drvdata(hdev);
> const struct wiiproto_handler *h;
> int i;
> - unsigned long flags;
>
> if (size < 1)
> return -EINVAL;
> @@ -1646,9 +1624,8 @@ static int wiimote_hid_event(struct hid_device
> *hdev, struct hid_report *report,
> for (i = 0; handlers[i].id; ++i) {
> h = &handlers[i];
> if (h->id == raw_data[0] && h->size < size) {
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - h->func(wdata, &raw_data[1]);
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock)
> + h->func(wdata, &raw_data[1]);
> break;
> }
> }
> @@ -1666,11 +1643,9 @@ static ssize_t wiimote_ext_show(struct device
> *dev,
> {
> struct wiimote_data *wdata = dev_to_wii(dev);
> __u8 type;
> - unsigned long flags;
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - type = wdata->state.exttype;
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock)
> + type = wdata->state.exttype;
>
> switch (type) {
> case WIIMOTE_EXT_NONE:
> @@ -1719,11 +1694,9 @@ static ssize_t wiimote_dev_show(struct device *dev,
> {
> struct wiimote_data *wdata = dev_to_wii(dev);
> __u8 type;
> - unsigned long flags;
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - type = wdata->state.devtype;
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock)
> + type = wdata->state.devtype;
>
> switch (type) {
> case WIIMOTE_DEV_GENERIC:
> @@ -1774,14 +1747,11 @@ static struct wiimote_data
> *wiimote_create(struct hid_device *hdev)
>
> static void wiimote_destroy(struct wiimote_data *wdata)
> {
> - unsigned long flags;
> -
> wiidebug_deinit(wdata);
>
> /* prevent init_worker from being scheduled again */
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wdata->state.flags |= WIIPROTO_FLAG_EXITING;
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock)
> + wdata->state.flags |= WIIPROTO_FLAG_EXITING;
>
> cancel_work_sync(&wdata->init_worker);
> timer_shutdown_sync(&wdata->timer);
> diff --git a/drivers/hid/hid-wiimote-debug.c b/drivers/hid/hid-wiimote-debug.c
> index 5f74917781f28..df6f830ee791c 100644
> --- a/drivers/hid/hid-wiimote-debug.c
> +++ b/drivers/hid/hid-wiimote-debug.c
> @@ -7,6 +7,7 @@
> /*
> */
>
> +#include <linux/cleanup.h>
> #include <linux/debugfs.h>
> #include <linux/module.h>
> #include <linux/seq_file.h>
> @@ -25,7 +26,6 @@ static ssize_t wiidebug_eeprom_read(struct file *f,
> char __user *u, size_t s,
> {
> struct wiimote_debug *dbg = f->private_data;
> struct wiimote_data *wdata = dbg->wdata;
> - unsigned long flags;
> ssize_t ret;
> char buf[16];
> __u16 size = 0;
> @@ -41,20 +41,19 @@ static ssize_t wiidebug_eeprom_read(struct file *f,
> char __user *u, size_t s,
> if (ret)
> return ret;
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wdata->state.cmd_read_size = s;
> - wdata->state.cmd_read_buf = buf;
> - wiimote_cmd_set(wdata, WIIPROTO_REQ_RMEM, *off & 0xffff);
> - wiiproto_req_reeprom(wdata, *off, s);
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock) {
> + wdata->state.cmd_read_size = s;
> + wdata->state.cmd_read_buf = buf;
> + wiimote_cmd_set(wdata, WIIPROTO_REQ_RMEM, *off & 0xffff);
> + wiiproto_req_reeprom(wdata, *off, s);
> + }
>
> ret = wiimote_cmd_wait(wdata);
> if (!ret)
> size = wdata->state.cmd_read_size;
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wdata->state.cmd_read_buf = NULL;
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock)
> + wdata->state.cmd_read_buf = NULL;
>
> wiimote_cmd_release(wdata);
>
> @@ -99,12 +98,10 @@ static int wiidebug_drm_show(struct seq_file *f, void *p)
> {
> struct wiimote_debug *dbg = f->private;
> const char *str = NULL;
> - unsigned long flags;
> __u8 drm;
>
> - spin_lock_irqsave(&dbg->wdata->state.lock, flags);
> - drm = dbg->wdata->state.drm;
> - spin_unlock_irqrestore(&dbg->wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &dbg->wdata->state.lock)
> + drm = dbg->wdata->state.drm;
>
> if (drm < WIIPROTO_REQ_MAX)
> str = wiidebug_drmmap[drm];
> @@ -126,7 +123,6 @@ static ssize_t wiidebug_drm_write(struct file *f,
> const char __user *u,
> {
> struct seq_file *sf = f->private_data;
> struct wiimote_debug *dbg = sf->private;
> - unsigned long flags;
> char buf[16];
> ssize_t len;
> int i;
> @@ -150,12 +146,12 @@ static ssize_t wiidebug_drm_write(struct file *f,
> const char __user *u,
> if (i == WIIPROTO_REQ_MAX)
> i = simple_strtoul(buf, NULL, 16);
>
> - spin_lock_irqsave(&dbg->wdata->state.lock, flags);
> - dbg->wdata->state.flags &= ~WIIPROTO_FLAG_DRM_LOCKED;
> - wiiproto_req_drm(dbg->wdata, (__u8) i);
> - if (i != WIIPROTO_REQ_NULL)
> - dbg->wdata->state.flags |= WIIPROTO_FLAG_DRM_LOCKED;
> - spin_unlock_irqrestore(&dbg->wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &dbg->wdata->state.lock) {
> + dbg->wdata->state.flags &= ~WIIPROTO_FLAG_DRM_LOCKED;
> + wiiproto_req_drm(dbg->wdata, (__u8) i);
> + if (i != WIIPROTO_REQ_NULL)
> + dbg->wdata->state.flags |= WIIPROTO_FLAG_DRM_LOCKED;
> + }
>
> return len;
> }
> @@ -172,7 +168,6 @@ static const struct file_operations wiidebug_drm_fops = {
> int wiidebug_init(struct wiimote_data *wdata)
> {
> struct wiimote_debug *dbg;
> - unsigned long flags;
>
> dbg = kzalloc_obj(*dbg);
> if (!dbg)
> @@ -186,9 +181,8 @@ int wiidebug_init(struct wiimote_data *wdata)
> dbg->drm = debugfs_create_file("drm", S_IRUSR,
> dbg->wdata->hdev->debug_dir, dbg, &wiidebug_drm_fops);
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wdata->debug = dbg;
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock)
> + wdata->debug = dbg;
>
> return 0;
>
> @@ -197,14 +191,12 @@ int wiidebug_init(struct wiimote_data *wdata)
> void wiidebug_deinit(struct wiimote_data *wdata)
> {
> struct wiimote_debug *dbg = wdata->debug;
> - unsigned long flags;
>
> if (!dbg)
> return;
>
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wdata->debug = NULL;
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock)
> + wdata->debug = NULL;
>
> debugfs_remove(dbg->drm);
> debugfs_remove(dbg->eeprom);
> diff --git a/drivers/hid/hid-wiimote-modules.c
> b/drivers/hid/hid-wiimote-modules.c
> index dccb78bb3afd6..3cd6144667404 100644
> --- a/drivers/hid/hid-wiimote-modules.c
> +++ b/drivers/hid/hid-wiimote-modules.c
> @@ -30,6 +30,7 @@
> * input devices.
> */
>
> +#include <linux/cleanup.h>
> #include <linux/device.h>
> #include <linux/hid.h>
> #include <linux/input.h>
> @@ -341,7 +342,6 @@ static int wiimod_led_probe(const struct wiimod_ops *ops,
> struct device *dev = &wdata->hdev->dev;
> size_t namesz = strlen(dev_name(dev)) + 9;
> struct led_classdev *led;
> - unsigned long flags;
> char *name;
> int ret;
>
> @@ -364,9 +364,8 @@ static int wiimod_led_probe(const struct wiimod_ops *ops,
>
> /* enable LED1 to stop initial LED-blinking */
> if (ops->arg == 0) {
> - spin_lock_irqsave(&wdata->state.lock, flags);
> - wiiproto_req_leds(wdata, WIIPROTO_FLAG_LED1);
> - spin_unlock_irqrestore(&wdata->state.lock, flags);
> + scoped_guard(spinlock_irqsave, &wdata->state.lock)
> + wiiproto_req_leds(wdata, WIIPROTO_FLAG_LED1);
> }
>
> return 0;
> --
> 2.53.0
next prev parent reply other threads:[~2026-07-31 9:08 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-29 16:49 [PATCH v3 0/4] HID: wiimote: new LED behavior on connect, scoped guards, uaf Rafael Passos
2026-07-29 16:49 ` [PATCH v3 1/4] HID: wiimote: turn on the LEDs indicating the controller id Rafael Passos
2026-07-29 17:07 ` sashiko-bot
2026-07-31 9:02 ` David Rheinsberg
2026-07-29 16:49 ` [PATCH v3 2/4] HID: wiimote: replace spinlock pairs with scoped_guard Rafael Passos
2026-07-29 17:07 ` sashiko-bot
2026-07-31 9:08 ` David Rheinsberg [this message]
2026-07-29 16:49 ` [PATCH v3 3/4] HID: wiimote: use scoped cleanup in wiimote and led probes Rafael Passos
2026-07-29 17:14 ` sashiko-bot
2026-07-31 11:18 ` David Rheinsberg
2026-07-29 16:49 ` [PATCH v3 4/4] HID: wiimote: fix uaf when hid events are handled during destroy Rafael Passos
2026-07-29 17:14 ` sashiko-bot
2026-07-31 11:17 ` David Rheinsberg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52967401-e1b0-4c47-a00d-b53d238641d0@app.fastmail.com \
--to=david@readahead.eu \
--cc=bentiss@kernel.org \
--cc=jikos@kernel.org \
--cc=jkoolstra@xs4all.nl \
--cc=linux-input@vger.kernel.org \
--cc=me@brighamcampbell.com \
--cc=rafael@rcpassos.me \
--cc=skhan@linuxfoundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox