Linux Input/HID development
 help / color / mirror / Atom feed
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

  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