From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: "Ali Ahmet Memiş" <aliamemis@disroot.org>
Cc: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
"Mark Pearson" <mpearson-lenovo@squebb.ca>,
"Derek J. Clark" <derekjohn.clark@gmail.com>,
"Henrique de Moraes Holschuh" <hmh@hmh.eng.br>,
"Hans de Goede" <hansg@kernel.org>,
"Nitin Joshi" <nitjoshi@gmail.com>,
"Andrzej Pietrasiewicz" <andrzej.p@collabora.com>,
platform-driver-x86@vger.kernel.org,
ibm-acpi-devel@lists.sourceforge.net,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] platform/x86: thinkpad_acpi: Use input_device_enabled()
Date: Wed, 30 Sep 2026 12:37:54 -0700 [thread overview]
Message-ID: <ar1iwx_390hWw_e7@google.com> (raw)
In-Reply-To: <20260930075829.53484-1-aliamemis@disroot.org>
On Wed, Sep 30, 2026 at 10:58:29AM +0300, Ali Ahmet Memiş wrote:
> On Tue, Sep 15, 2026 at 02:32:34PM +0300, Ilpo Järvinen wrote:
> > [1/1] platform/x86: thinkpad_acpi: Use input_device_enabled()
> > commit: be0048786d53375fa4eace15cfdf65593956a1a2
>
> This hangs on module load for me. hotkey_inputdev_open() gets
> called from input_open_device() with dev->mutex already held, so the
> new lock in hotkey_poll_setup() deadlocks:
>
> INFO: task insmod:28182 is blocked on a mutex likely owned by task insmod:28182.
> hotkey_poll_setup+0x50/0x140 [thinkpad_acpi]
> hotkey_inputdev_open+0x36/0x50 [thinkpad_acpi]
> input_open_device+0x9d/0x130
> kbd_connect+0x8f/0xb0
>
> I guess hotkey_inputdev_close() has the same issue. This was
> next-20260929's thinkpad_acpi.c built against 7.1.11.
Hmm, indeed. I wonder if below will fox this for you.
--
Dmitry
platform/x86: thinkpad_acpi: fix deadlock in hotkey input open/close
Commit d6479c25ecef ("platform/x86: thinkpad_acpi: Use
input_device_enabled()") changed hotkey_poll_setup() to acquire
tpacpi_inputdev->mutex and call input_device_enabled(tpacpi_inputdev).
However, the input core already holds dev->mutex when invoking a
device's open() and close() callbacks. Because hotkey_inputdev_open()
and hotkey_inputdev_close() call into hotkey_poll_setup(), attempting to
acquire tpacpi_inputdev->mutex again results in an immediate
self-deadlock.
Additionally, locking tpacpi_inputdev->mutex inside hotkey_poll_setup()
while holding hotkey_mutex introduces an ABBA lock ordering inversion
with hotkey_inputdev_open() and hotkey_inputdev_close(), which acquire
hotkey_mutex while holding tpacpi_inputdev->mutex. Finally,
input_inhibit_device() calls dev->close() before setting dev->inhibited,
so input_device_enabled() still returns true inside
hotkey_inputdev_close().
Track whether the input device is active in a driver-local boolean
protected by hotkey_mutex instead of locking tpacpi_inputdev->mutex and
querying input_device_enabled().
Fixes: d6479c25ecef ("platform/x86: thinkpad_acpi: Use input_device_enabled()")
Assisted-by: LLM
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/platform/x86/lenovo/thinkpad_acpi.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/drivers/platform/x86/lenovo/thinkpad_acpi.c b/drivers/platform/x86/lenovo/thinkpad_acpi.c
index 1225b01ed14d..40e9763a12f8 100644
--- a/drivers/platform/x86/lenovo/thinkpad_acpi.c
+++ b/drivers/platform/x86/lenovo/thinkpad_acpi.c
@@ -1887,6 +1887,7 @@ static u32 hotkey_reserved_mask; /* events better left disabled */
static u32 hotkey_driver_mask; /* events needed by the driver */
static u32 hotkey_user_mask; /* events visible to userspace */
static u32 hotkey_acpi_mask; /* events enabled in firmware */
+static bool hotkey_input_enabled;
static bool tpacpi_driver_event(const unsigned int hkey_event);
static void hotkey_poll_setup(const bool may_warn);
@@ -2544,10 +2545,8 @@ static void hotkey_poll_setup(const bool may_warn)
lockdep_assert_held(&hotkey_mutex);
- guard(mutex)(&tpacpi_inputdev->mutex);
if (hotkey_poll_freq > 0 &&
- (poll_driver_mask ||
- (poll_user_mask && input_device_enabled(tpacpi_inputdev)))) {
+ (poll_driver_mask || (poll_user_mask && hotkey_input_enabled))) {
if (!tpacpi_hotkey_task) {
tpacpi_hotkey_task = kthread_run(hotkey_kthread,
NULL, TPACPI_NVRAM_KTHREAD_NAME);
@@ -2602,7 +2601,10 @@ static int hotkey_inputdev_open(struct input_dev *dev)
switch (tpacpi_lifecycle) {
case TPACPI_LIFE_INIT:
case TPACPI_LIFE_RUNNING:
- hotkey_poll_setup_safe(false);
+ scoped_guard(mutex, &hotkey_mutex) {
+ hotkey_input_enabled = true;
+ hotkey_poll_setup(false);
+ }
return 0;
case TPACPI_LIFE_EXITING:
return -EBUSY;
@@ -2615,10 +2617,14 @@ static int hotkey_inputdev_open(struct input_dev *dev)
static void hotkey_inputdev_close(struct input_dev *dev)
{
+ guard(mutex)(&hotkey_mutex);
+
+ hotkey_input_enabled = false;
+
/* disable hotkey polling when possible */
if (tpacpi_lifecycle != TPACPI_LIFE_EXITING &&
!(hotkey_source_mask & hotkey_driver_mask))
- hotkey_poll_setup_safe(false);
+ hotkey_poll_setup(false);
}
/* sysfs hotkey enable ------------------------------------------------- */
--
2.56.0.rc1.315.gc6ed9934b7-goog
next prev parent reply other threads:[~2026-09-30 19:37 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-05 4:03 [PATCH] platform/x86: thinkpad_acpi: Use input_device_enabled() Dmitry Torokhov
2026-08-05 14:51 ` Mark Pearson
2026-08-05 15:52 ` Dmitry Torokhov
2026-08-05 16:15 ` Mark Pearson
2026-08-06 6:20 ` Dmitry Torokhov
2026-09-15 11:32 ` Ilpo Järvinen
2026-09-30 7:58 ` Ali Ahmet Memiş
2026-09-30 19:37 ` Dmitry Torokhov [this message]
2026-09-30 20:00 ` Ali Ahmet Memiş
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=ar1iwx_390hWw_e7@google.com \
--to=dmitry.torokhov@gmail.com \
--cc=aliamemis@disroot.org \
--cc=andrzej.p@collabora.com \
--cc=derekjohn.clark@gmail.com \
--cc=hansg@kernel.org \
--cc=hmh@hmh.eng.br \
--cc=ibm-acpi-devel@lists.sourceforge.net \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mpearson-lenovo@squebb.ca \
--cc=nitjoshi@gmail.com \
--cc=platform-driver-x86@vger.kernel.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 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.