From: sashiko-bot@kernel.org
To: "Denis Benato" <denis.benato@linux.dev>
Cc: linux-input@vger.kernel.org, dmitry.torokhov@gmail.com
Subject: Re: [PATCH v12 06/17] HID: asus: add triggers inner and outer range configuration
Date: Sat, 31 Oct 2026 17:54:02 +0000 [thread overview]
Message-ID: <sashiko-outbox-192078@kernel.org> (raw)
In-Reply-To: <20261031174130.208240-7-denis.benato@linux.dev>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] HID: asus: AB-BA deadlock between ally_prefs.lock and kernfs active refs
--
commit e95ac74bc1842538166d7189f1bc71f71eb61de4
Author: Denis Benato <denis.benato@linux.dev>
HID: asus: add triggers inner and outer range configuration
This commit adds sysfs attributes to configure the inner and outer trigger
ranges for ROG Ally devices, along with restoring those trigger ranges on
device initialization.
> diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c
> index 50b0e60405958..5cf7258bc4273 100644
> --- a/drivers/hid/hid-asus.c
> +++ b/drivers/hid/hid-asus.c
[ ... ]
> @@ -1342,9 +1351,201 @@ static const struct attribute_group ally_right_joystick_axis_group = {
> .attrs = right_joystick_axis_attrs,
> };
>
[ ... ]
> +static ssize_t ally_trigger_limit_show(char *buf, enum ally_trigger_limit which)
> +{
> + guard(mutex)(&ally_prefs.lock);
> +
> + if (!ally_prefs.user_cal_support)
> + return -EOPNOTSUPP;
> +
> + return sysfs_emit(buf, "%u\n", *ally_trigger_limits[which]);
> +}
> +
> +static ssize_t ally_trigger_limit_store(struct device *dev, const char *buf,
> + size_t count,
> + enum ally_trigger_limit which,
> + int lo, int hi,
> + const char *group, const char *name)
> +{
> + u8 value, v[ARRAY_SIZE(ally_trigger_limits)];
> + struct hid_device *hdev = to_hid_device(dev);
> + size_t i;
> + int ret;
> +
> + ret = kstrtou8(buf, 10, &value);
> + if (ret || value < lo || value > hi)
> + return -EINVAL;
> +
> + scoped_guard(mutex, &ally_prefs.lock) {
> + if (!ally_prefs.user_cal_support)
> + return -EOPNOTSUPP;
> +
> + for (i = 0; i < ARRAY_SIZE(v); i++)
> + v[i] = *ally_trigger_limits[i];
> + v[which] = value;
> +
> + ret = ally_set_trigger_ranges(hdev, v[ALLY_LEFT_MIN], v[ALLY_LEFT_MAX],
> + v[ALLY_RIGHT_MIN], v[ALLY_RIGHT_MAX]);
> + if (ret)
> + return ret;
> +
> + *ally_trigger_limits[which] = value;
> + }
> +
> + sysfs_notify(&dev->kobj, group, name);
> +
> + return count;
> +}
[ ... ]
> +static const struct attribute_group ally_left_trigger_group = {
> + .name = "left_trigger",
> + .attrs = left_trigger_attrs,
> +};
> +
> +static const struct attribute_group ally_right_trigger_group = {
> + .name = "right_trigger",
> + .attrs = right_trigger_attrs,
> +};
> static const struct attribute_group *const ally_cal_attr_groups[] = {
> &ally_left_joystick_axis_group,
> &ally_right_joystick_axis_group,
> + &ally_left_trigger_group,
> + &ally_right_trigger_group,
> };
[Severity: High]
Can registering ally_left_trigger_group and ally_right_trigger_group in
ally_cal_attr_groups[] cause an AB-BA deadlock between ally_prefs.lock and
the kernfs active references on the trigger limit sysfs attributes?
When userspace reads or writes range_lower_limit or range_upper_limit,
kernfs_fop_read_iter() or kernfs_fop_write_iter() acquires the attribute's
active reference (kn->active) before calling ally_trigger_limit_show() or
ally_trigger_limit_store(), which then acquires ally_prefs.lock:
CPU 0:
kernfs_fop_read_iter() / kernfs_fop_write_iter()
kernfs_get_active() [holds kn->active]
ally_trigger_limit_show() / ally_trigger_limit_store()
mutex_lock(&ally_prefs.lock)
Meanwhile, during device removal in ally_sysfs_remove() (or error rollback
in ally_prefs_setup()), ally_prefs.lock is acquired before calling
sysfs_remove_group() on ally_cal_attr_groups[]:
drivers/hid/hid-asus.c:ally_sysfs_remove() {
...
guard(mutex)(&ally_prefs.lock);
...
if (ally_prefs.user_cal_support || ally_prefs.anti_deadzone_support ||
ally_prefs.resp_curve_support) {
for (i = 0; i < ARRAY_SIZE(ally_cal_attr_groups); i++)
sysfs_remove_group(&hdev->dev.kobj, ally_cal_attr_groups[i]);
}
}
sysfs_remove_group() calls __kernfs_remove() -> kernfs_drain(), which waits
for kn->active to drain while holding ally_prefs.lock:
CPU 1:
ally_sysfs_remove() / ally_prefs_setup()
mutex_lock(&ally_prefs.lock)
sysfs_remove_group()
__kernfs_remove()
kernfs_drain() [waits for kn->active]
If a sysfs read or write on the new trigger attributes runs concurrently
with device disconnect, unbind, or setup rollback, wouldn't CPU 0 and CPU 1
deadlock waiting on each other?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261031174130.208240-1-denis.benato@linux.dev?part=6
next prev parent reply other threads:[~2026-10-31 17:54 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-31 17:41 [PATCH v12 00/17] HID: asus: add support for ROG Ally handhelds Denis Benato
2026-10-31 17:41 ` [PATCH v12 01/17] HID: asus: size feature reports from the HID report descriptor Denis Benato
2026-10-31 18:04 ` sashiko-bot
2026-10-31 18:08 ` Denis Benato
2026-10-31 18:30 ` Rebecca Mara Müller
2026-11-01 13:26 ` Denis Benato
2026-10-31 17:41 ` [PATCH v12 02/17] HID: asus: add support for ROG Ally handhelds Denis Benato
2026-10-31 18:11 ` sashiko-bot
2026-10-31 17:41 ` [PATCH v12 03/17] HID: asus: add gamepad configuration Denis Benato
2026-10-31 17:59 ` sashiko-bot
2026-10-31 17:41 ` [PATCH v12 04/17] HID: asus: add vibration strength configuration Denis Benato
2026-10-31 17:41 ` [PATCH v12 05/17] HID: asus: add joysticks inner and outer range configuration Denis Benato
2026-10-31 17:57 ` sashiko-bot
2026-10-31 17:41 ` [PATCH v12 06/17] HID: asus: add triggers " Denis Benato
2026-10-31 17:54 ` sashiko-bot [this message]
2026-10-31 17:41 ` [PATCH v12 07/17] HID: asus: add joysticks anti-deadzone configuration Denis Benato
2026-10-31 17:51 ` sashiko-bot
2026-10-31 17:41 ` [PATCH v12 08/17] HID: asus: add support for response curve Denis Benato
2026-10-31 17:41 ` [PATCH v12 09/17] HID: asus: add support to force feedback Denis Benato
2026-10-31 17:41 ` [PATCH v12 10/17] HID: asus: add support for gamepad mode Denis Benato
2026-10-31 17:41 ` [PATCH v12 11/17] HID: asus: add support for turbo buttons Denis Benato
2026-10-31 17:54 ` sashiko-bot
2026-10-31 17:41 ` [PATCH v12 12/17] HID: asus: add support for btn remapping Denis Benato
2026-10-31 18:00 ` sashiko-bot
2026-10-31 19:06 ` Denis Benato
2026-10-31 17:41 ` [PATCH v12 13/17] HID: asus: identify XG Mobile stations and bind the LED to the reported model Denis Benato
2026-10-31 17:41 ` [PATCH v12 14/17] HID: asus: expose XG Mobile identity and firmware information Denis Benato
2026-10-31 17:41 ` [PATCH v12 15/17] HID: asus: document ROG XG Mobile sysfs attributes Denis Benato
2026-10-31 17:41 ` [PATCH v12 16/17] platform/x86: asus-armoury: pick the eGPU activation from the reported GPU Denis Benato
2026-10-31 17:41 ` [PATCH v12 17/17] MAINTAINERS: add maintainer for the ASUS HID driver Denis Benato
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=sashiko-outbox-192078@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=denis.benato@linux.dev \
--cc=dmitry.torokhov@gmail.com \
--cc=linux-input@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.