From: "Mark Pearson" <mpearson-lenovo@squebb.ca>
To: "Dmitry Torokhov" <dmitry.torokhov@gmail.com>,
"Derek J . Clark" <derekjohn.clark@gmail.com>
Cc: linux-kernel@vger.kernel.org,
"platform-driver-x86@vger.kernel.org"
<platform-driver-x86@vger.kernel.org>,
ibm-acpi-devel@lists.sourceforge.net,
"Henrique de Moraes Holschuh" <hmh@hmh.eng.br>,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
"Nitin Joshi" <nitjoshi@gmail.com>,
"Hans de Goede" <hansg@kernel.org>
Subject: Re: [ibm-acpi-devel] [PATCH 1/3] platform/x86: thinkpad_acpi: convert mutex_lock() to guard(mutex)
Date: Wed, 12 Aug 2026 15:55:06 -0400 [thread overview]
Message-ID: <24dca37c-b91f-4dba-aa8f-4a9fc55e8f2b@app.fastmail.com> (raw)
In-Reply-To: <7a924f0a-0afb-4ae0-a106-37cdc76836bd@app.fastmail.com>
On Wed, Aug 12, 2026, at 2:29 PM, Mark Pearson wrote:
> Thanks Dmitry,
>
> On Thu, Aug 6, 2026, at 2:19 AM, Dmitry Torokhov wrote:
>> Convert straightforward mutex_lock() and mutex_unlock() usages for
>> hotkey_mutex, tpacpi_inputdev_send_mutex, kbdlight_mutex, lcdshadow_dev
>> lock, and dytc_mutex to guard(mutex) and scoped_guard(mutex) helpers
>> from linux/cleanup.h.
>>
>> This improves code readability and ensures that mutexes are
>> automatically released when exiting their respective scopes.
>>
>> Assisted-by: Antigravity:gemini-3.6-flash
>> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
>> ---
>> drivers/platform/x86/lenovo/thinkpad_acpi.c | 139 ++++++++------------
>> 1 file changed, 57 insertions(+), 82 deletions(-)
>>
>> diff --git a/drivers/platform/x86/lenovo/thinkpad_acpi.c
>> b/drivers/platform/x86/lenovo/thinkpad_acpi.c
>> index f8e116e8a65d..beb85ea1103b 100644
>> --- a/drivers/platform/x86/lenovo/thinkpad_acpi.c
>> +++ b/drivers/platform/x86/lenovo/thinkpad_acpi.c
>> @@ -2164,7 +2164,7 @@ static int tpacpi_hotkey_driver_mask_set(const
>> u32 mask)
>> return 0;
>> }
>>
>> - mutex_lock(&hotkey_mutex);
>> + guard(mutex)(&hotkey_mutex);
>>
>> HOTKEY_CONFIG_CRITICAL_START
>> hotkey_driver_mask = mask;
>> @@ -2177,8 +2177,6 @@ static int tpacpi_hotkey_driver_mask_set(const u32 mask)
>> ~hotkey_source_mask);
>> hotkey_poll_setup(true);
>>
>> - mutex_unlock(&hotkey_mutex);
>> -
>> return rc;
>> }
>>
>> @@ -2202,15 +2200,12 @@ static void tpacpi_input_send_tabletsw(void)
>> {
>> int state;
>>
>> - if (tp_features.hotkey_tablet &&
>> - !hotkey_get_tablet_mode(&state)) {
>> - mutex_lock(&tpacpi_inputdev_send_mutex);
>> + if (tp_features.hotkey_tablet && !hotkey_get_tablet_mode(&state)) {
>> + guard(mutex)(&tpacpi_inputdev_send_mutex);
>>
>> input_report_switch(tpacpi_inputdev,
>> SW_TABLET_MODE, !!state);
>> input_sync(tpacpi_inputdev);
>> -
>> - mutex_unlock(&tpacpi_inputdev_send_mutex);
>> }
>> }
>>
>> @@ -2235,7 +2230,6 @@ static int get_camera_shutter(void)
>>
>> static bool tpacpi_input_send_key(const u32 hkey, bool *send_acpi_ev)
>> {
>> - bool known_ev;
>> u32 scancode;
>>
>> if (tpacpi_driver_event(hkey))
>> @@ -2278,11 +2272,8 @@ static bool tpacpi_input_send_key(const u32
>> hkey, bool *send_acpi_ev)
>> scancode = hkey;
>> }
>>
>> - mutex_lock(&tpacpi_inputdev_send_mutex);
>> - known_ev = sparse_keymap_report_event(tpacpi_inputdev, scancode, 1, true);
>> - mutex_unlock(&tpacpi_inputdev_send_mutex);
>> -
>> - return known_ev;
>> + guard(mutex)(&tpacpi_inputdev_send_mutex);
>> + return sparse_keymap_report_event(tpacpi_inputdev, scancode, 1, true);
>> }
>>
>> #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL
>> @@ -2572,9 +2563,8 @@ static void hotkey_poll_setup(const bool may_warn)
>>
>> static void hotkey_poll_setup_safe(const bool may_warn)
>> {
>> - mutex_lock(&hotkey_mutex);
>> + guard(mutex)(&hotkey_mutex);
>> hotkey_poll_setup(may_warn);
>> - mutex_unlock(&hotkey_mutex);
>> }
>>
>> static void hotkey_poll_set_freq(unsigned int freq)
>> @@ -3077,13 +3067,11 @@ static void tpacpi_send_radiosw_update(void)
>>
>> /* Issue rfkill input event for WLSW switch */
>> if (!(wlsw < 0)) {
>> - mutex_lock(&tpacpi_inputdev_send_mutex);
>> + guard(mutex)(&tpacpi_inputdev_send_mutex);
>>
>> input_report_switch(tpacpi_inputdev,
>> SW_RFKILL_ALL, (wlsw > 0));
>> input_sync(tpacpi_inputdev);
>> -
>> - mutex_unlock(&tpacpi_inputdev_send_mutex);
>> }
>>
>> /*
>> @@ -3095,7 +3083,7 @@ static void tpacpi_send_radiosw_update(void)
>>
>> static void hotkey_exit(void)
>> {
>> - mutex_lock(&hotkey_mutex);
>> + guard(mutex)(&hotkey_mutex);
>> hotkey_poll_stop_sync();
>> dbg_printk(TPACPI_DBG_EXIT | TPACPI_DBG_HKEY,
>> "restoring original HKEY status and mask\n");
>> @@ -3105,8 +3093,6 @@ static void hotkey_exit(void)
>> hotkey_mask_set(hotkey_orig_mask)) |
>> hotkey_status_set(false)) != 0)
>> pr_err("failed to restore hot key mask to BIOS defaults\n");
>> -
>> - mutex_unlock(&hotkey_mutex);
>> }
>>
>> /*
>> @@ -3423,11 +3409,11 @@ static int __init hotkey_init(struct
>> ibm_init_struct *iibm)
>> if (tp_features.hotkey_mask) {
>> /* hotkey_source_mask *must* be zero for
>> * the first hotkey_mask_get to return hotkey_orig_mask */
>> - mutex_lock(&hotkey_mutex);
>> - res = hotkey_mask_get();
>> - mutex_unlock(&hotkey_mutex);
>> - if (res)
>> - return res;
>> + scoped_guard(mutex, &hotkey_mutex) {
>> + res = hotkey_mask_get();
>> + if (res)
>> + return res;
>> + }
>>
>> hotkey_orig_mask = hotkey_acpi_mask;
>> } else {
>> @@ -3526,11 +3512,11 @@ static int __init hotkey_init(struct
>> ibm_init_struct *iibm)
>> hotkey_exit();
>> return res;
>> }
>> - mutex_lock(&hotkey_mutex);
>> - res = hotkey_mask_set(((hotkey_all_mask & ~hotkey_reserved_mask)
>> - | hotkey_driver_mask)
>> - & ~hotkey_source_mask);
>> - mutex_unlock(&hotkey_mutex);
>> + scoped_guard(mutex, &hotkey_mutex) {
>> + res = hotkey_mask_set(((hotkey_all_mask & ~hotkey_reserved_mask)
>> + | hotkey_driver_mask)
>> + & ~hotkey_source_mask);
>> + }
>> if (res < 0 && res != -ENXIO) {
>> hotkey_exit();
>> return res;
>> @@ -3977,11 +3963,11 @@ static void hotkey_resume(void)
>> {
>> tpacpi_disable_brightness_delay();
>>
>> - mutex_lock(&hotkey_mutex);
>> - if (hotkey_status_set(true) < 0 ||
>> - hotkey_mask_set(hotkey_acpi_mask) < 0)
>> - pr_err("error while attempting to reset the event firmware interface\n");
>> - mutex_unlock(&hotkey_mutex);
>> + scoped_guard(mutex, &hotkey_mutex) {
>> + if (hotkey_status_set(true) < 0 ||
>> + hotkey_mask_set(hotkey_acpi_mask) < 0)
>> + pr_err("error while attempting to reset the event firmware interface\n");
>> + }
>>
>> tpacpi_send_radiosw_update();
>> tpacpi_input_send_tabletsw();
>> @@ -5034,21 +5020,16 @@ static DEFINE_MUTEX(kbdlight_mutex);
>>
>> static int kbdlight_set_level(int level)
>> {
>> - int ret = 0;
>> -
>> if (!hkey_handle)
>> return -ENXIO;
>>
>> - mutex_lock(&kbdlight_mutex);
>> + guard(mutex)(&kbdlight_mutex);
>>
>> if (!acpi_evalf(hkey_handle, NULL, "MLCS", "dd", level))
>> - ret = -EIO;
>> - else
>> - kbdlight_brightness = level;
>> -
>> - mutex_unlock(&kbdlight_mutex);
>> + return -EIO;
>>
>> - return ret;
>> + kbdlight_brightness = level;
>> + return 0;
>> }
>>
>> static int kbdlight_get_level(void)
>> @@ -10103,9 +10084,8 @@ static void lcdshadow_resume(void)
>> if (!lcdshadow_dev)
>> return;
>>
>> - mutex_lock(&lcdshadow_dev->lock);
>> + guard(mutex)(&lcdshadow_dev->lock);
>> lcdshadow_set_sw_state(lcdshadow_dev, lcdshadow_dev->sw_state);
>> - mutex_unlock(&lcdshadow_dev->lock);
>> }
>>
>> static int lcdshadow_read(struct seq_file *m)
>> @@ -10137,9 +10117,8 @@ static int lcdshadow_write(char *buf)
>> if (state >= 2 || state < 0)
>> return -EINVAL;
>>
>> - mutex_lock(&lcdshadow_dev->lock);
>> - res = lcdshadow_set_sw_state(lcdshadow_dev, state);
>> - mutex_unlock(&lcdshadow_dev->lock);
>> + scoped_guard(mutex, &lcdshadow_dev->lock)
>> + res = lcdshadow_set_sw_state(lcdshadow_dev, state);
>>
>> drm_privacy_screen_call_notifier_chain(lcdshadow_dev);
>>
>> @@ -10603,26 +10582,26 @@ static const struct platform_profile_ops
>> dytc_profile_ops = {
>> static void dytc_profile_refresh(void)
>> {
>> enum platform_profile_option profile;
>> - int output = 0, err = 0;
>> + int output = 0, err;
>> int perfmode, funcmode = 0;
>>
>> - mutex_lock(&dytc_mutex);
>> - if (dytc_capabilities & BIT(DYTC_FC_MMC)) {
>> - if (dytc_mmc_get_available)
>> - err = dytc_command(DYTC_CMD_MMC_GET, &output);
>> - else
>> - err = dytc_cql_command(DYTC_CMD_GET, &output);
>> - funcmode = DYTC_FUNCTION_MMC;
>> - } else if (dytc_capabilities & BIT(DYTC_FC_PSC)) {
>> - err = dytc_command(DYTC_CMD_GET, &output);
>> - /* Check if we are PSC mode, or have AMT enabled */
>> - funcmode = (output >> DYTC_GET_FUNCTION_BIT) & 0xF;
>> - } else { /* Unknown profile mode */
>> - err = -ENODEV;
>> + scoped_guard(mutex, &dytc_mutex) {
>> + if (dytc_capabilities & BIT(DYTC_FC_MMC)) {
>> + if (dytc_mmc_get_available)
>> + err = dytc_command(DYTC_CMD_MMC_GET, &output);
>> + else
>> + err = dytc_cql_command(DYTC_CMD_GET, &output);
>> + funcmode = DYTC_FUNCTION_MMC;
>> + } else if (dytc_capabilities & BIT(DYTC_FC_PSC)) {
>> + err = dytc_command(DYTC_CMD_GET, &output);
>> + /* Check if we are PSC mode, or have AMT enabled */
>> + funcmode = (output >> DYTC_GET_FUNCTION_BIT) & 0xF;
>> + } else { /* Unknown profile mode */
>> + err = -ENODEV;
>> + }
>> + if (err)
>> + return;
>> }
>> - mutex_unlock(&dytc_mutex);
>> - if (err)
>> - return;
>>
>> perfmode = (output >> DYTC_GET_MODE_BIT) & 0xF;
>> err = convert_dytc_to_profile(funcmode, perfmode, &profile);
>> @@ -11425,7 +11404,7 @@ static bool tpacpi_driver_event(const unsigned
>> int hkey_event)
>> if (tp_features.kbdlight) {
>> enum led_brightness brightness;
>>
>> - mutex_lock(&kbdlight_mutex);
>> + guard(mutex)(&kbdlight_mutex);
>>
>> /*
>> * Check the brightness actually changed, setting the brightness
>> @@ -11437,8 +11416,6 @@ static bool tpacpi_driver_event(const unsigned
>> int hkey_event)
>> led_classdev_notify_brightness_hw_changed(
>> &tpacpi_led_kbdlight.led_classdev, brightness);
>> }
>> -
>> - mutex_unlock(&kbdlight_mutex);
>> }
>> /* Key events are suppressed by default hotkey_user_mask */
>> return false;
>> @@ -11460,11 +11437,11 @@ static bool tpacpi_driver_event(const
>> unsigned int hkey_event)
>> enum drm_privacy_screen_status old_hw_state;
>> bool changed;
>>
>> - mutex_lock(&lcdshadow_dev->lock);
>> - old_hw_state = lcdshadow_dev->hw_state;
>> - lcdshadow_get_hw_state(lcdshadow_dev);
>> - changed = lcdshadow_dev->hw_state != old_hw_state;
>> - mutex_unlock(&lcdshadow_dev->lock);
>> + scoped_guard(mutex, &lcdshadow_dev->lock) {
>> + old_hw_state = lcdshadow_dev->hw_state;
>> + lcdshadow_get_hw_state(lcdshadow_dev);
>> + changed = lcdshadow_dev->hw_state != old_hw_state;
>> + }
>>
>> if (changed)
>> drm_privacy_screen_call_notifier_chain(lcdshadow_dev);
>> @@ -11485,12 +11462,10 @@ static bool tpacpi_driver_event(const
>> unsigned int hkey_event)
>> pr_err("Error retrieving camera shutter state after shutter
>> event\n");
>> return true;
>> }
>> - mutex_lock(&tpacpi_inputdev_send_mutex);
>> -
>> - input_report_switch(tpacpi_inputdev, SW_CAMERA_LENS_COVER,
>> camera_shutter_state);
>> - input_sync(tpacpi_inputdev);
>> -
>> - mutex_unlock(&tpacpi_inputdev_send_mutex);
>> + scoped_guard(mutex, &tpacpi_inputdev_send_mutex) {
>> + input_report_switch(tpacpi_inputdev, SW_CAMERA_LENS_COVER,
>> camera_shutter_state);
>> + input_sync(tpacpi_inputdev);
>> + }
>> return true;
>> case TP_HKEY_EV_DOUBLETAP_TOGGLE:
>> /* Toggle kernel-level doubletap event filtering */
>> --
>> 2.55.0.679.g6767b8d81c-goog
>
> Sorry, took me a while to get to this one.
> Changes look good, nice cleanup.
>
> Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca>
>
> Mark
>
Ran a build with all 3 patches on a P14s G7 and couldn't see any problems.
So, for the series:
Tested-by: Mark Pearson <mpearson-lenovo@squebb.ca>
next prev parent reply other threads:[~2026-08-12 19:55 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-06 6:19 [PATCH 1/3] platform/x86: thinkpad_acpi: convert mutex_lock() to guard(mutex) Dmitry Torokhov
2026-08-06 6:19 ` [PATCH 2/3] platform/x86: thinkpad_acpi: convert conditional mutex locks to ACQUIRE_ERR() Dmitry Torokhov
2026-08-12 18:53 ` Mark Pearson
2026-09-06 13:10 ` Ali Ahmet Memiş
2026-08-06 6:19 ` [PATCH 3/3] platform/x86: thinkpad_acpi: use __free(kfree) for automatic cleanup Dmitry Torokhov
2026-08-12 19:02 ` Mark Pearson
2026-09-06 13:10 ` Ali Ahmet Memiş
2026-08-12 18:29 ` [PATCH 1/3] platform/x86: thinkpad_acpi: convert mutex_lock() to guard(mutex) Mark Pearson
2026-08-12 19:55 ` Mark Pearson [this message]
2026-09-06 13:10 ` 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=24dca37c-b91f-4dba-aa8f-4a9fc55e8f2b@app.fastmail.com \
--to=mpearson-lenovo@squebb.ca \
--cc=derekjohn.clark@gmail.com \
--cc=dmitry.torokhov@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=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.