From: Peng Fan <peng.fan@oss.nxp.com>
To: Bartosz Golaszewski <brgl@kernel.org>
Cc: sashiko-reviews@lists.linux.dev, sashiko-bot@kernel.org,
linux-gpio@vger.kernel.org, Frank.Li@kernel.org,
imx@lists.linux.dev
Subject: Re: [PATCH v4 06/10] gpio: mxc: convert probe error handling to devres
Date: Fri, 9 Oct 2026 10:25:55 +0800 [thread overview]
Message-ID: <ashQs4mmqF0ECg3D@shlinux89> (raw)
In-Reply-To: <CAMRc=McOb8Yh3h2oPn4GU-hnSff3UBd8WZzO0PirXm7U=+G56w@mail.gmail.com>
On Thu, Oct 08, 2026 at 04:47:48AM -0500, Bartosz Golaszewski wrote:
>On Wed, 7 Oct 2026 12:59:26 +0200, sashiko-bot@kernel.org said:
>> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
>> - [High] pm: usage counter underflow due to mixed devm and manual autosuspend
>> --
>>
>> commit dc287cc46ea891b838f3b39a1fd6ed65d627a965
>> Author: Peng Fan <peng.fan@nxp.com>
>>
>> gpio: mxc: convert probe error handling to devres
>>
>> This patch converts the driver's probe error handling to use devres. It
>> replaces irq_domain_create_legacy() with devm_irq_domain_instantiate()
>> and updates the PM runtime initialization to use devm_ variants, eliminating
>> the need for manual cleanup labels.
>>
>>> diff --git a/drivers/gpio/gpio-mxc.c b/drivers/gpio/gpio-mxc.c
>>> index 5da603569d88d..54b09f1a4b509 100644
>>> --- a/drivers/gpio/gpio-mxc.c
>>> +++ b/drivers/gpio/gpio-mxc.c
>>> @@ -484,9 +485,13 @@ static int mxc_gpio_probe(struct platform_device *pdev)
>>> if (IS_ERR(port->clk))
>>> return PTR_ERR(port->clk);
>>>
>>> - pm_runtime_get_noresume(&pdev->dev);
>>> - pm_runtime_set_active(&pdev->dev);
>>> - pm_runtime_enable(&pdev->dev);
>>> + err = devm_pm_runtime_get_noresume(&pdev->dev);
>>> + if (err)
>>> + return dev_err_probe(&pdev->dev, err, "Failed to get PM runtime\n");
>>> +
>>> + err = devm_pm_runtime_set_active_enabled(&pdev->dev);
>>> + if (err)
>>> + return dev_err_probe(&pdev->dev, err, "Failed to enable PM runtime\n");
>>
>> [ ... ]
>>
>>> @@ -558,14 +567,6 @@ static int mxc_gpio_probe(struct platform_device *pdev)
>>> pm_runtime_put_autosuspend(&pdev->dev);
>>
>> [Severity: High]
>> Since devm_pm_runtime_get_noresume() increments the usage counter and queues
>> a devres action to drop it on unbind, will this manual call to
>> pm_runtime_put_autosuspend() cause an issue?
>>
>> Because the devres action remains queued, when the device is unbound (e.g.,
>> via device tree overlay removal or hot-unplug), the devres cleanup will
>> execute and decrement the usage counter a second time. Could this cause a PM
>> usage counter underflow, corrupting the device and parent power state?
>>
>
>Sounds right, please remove this call.
we need to keep it. Without it, the gpio port will never runs into suspended state.
I think it should be not be marked as High severity (:
The driver sets suppress_bind_attrs = true and has no .remove callback. So never
unbinds. Even if we do have unbind:
Probe success:
devm_pm_runtime_get_noresume() -> usage_count = 1, devres queues put_noidle
devm_pm_runtime_set_active_enabled -> devres queues disable + set_suspended
...probe succeeds...
pm_runtime_put_autosuspend() -> usage_count = 0, device may suspend
Unbind (devres cleanup, reverse order):
[1] pm_runtime_disable_action -> PM runtime disabled
[2] pm_runtime_set_suspended_action -> RPM_SUSPENDED
[3] pm_runtime_put_noidle_action -> usage_count = -1 <- underflow
With PM runtime disabled[1], pm_runtime_put_noidle() just does atomic_dec() on
a counter nobody reads - no idle/suspend work is queued, no parent power
state is touched.
So to make things a bit cleaner, we need use pm_runtime_get_resume(no devres),
and define __free for it.
DEFINE_FREE(pm_runtime_put_noidle, struct device *, if (_T) pm_runtime_put_noidle(_T))
Then in probe:
pm_runtime_get_noresume(dev);
struct device *pm_guard __free(pm_runtime_put_noidle) = dev;
err = devm_pm_runtime_set_active_enabled(dev);
if (err)
return dev_err_probe(dev, err, "..."); // guard fires -> put_noidle
/* ... all error returns automatically balanced ... */
/* success — disarm guard, do the real put */
no_free_ptr(pm_guard);
pm_runtime_put_autosuspend(dev);
return 0;
Thanks,
Peng
>
>Bart
>
next prev parent reply other threads:[~2026-10-09 2:21 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-07 10:44 [PATCH v4 00/10] gpio: mxc: bug fixes and probe cleanup Peng Fan (OSS)
2026-10-07 10:44 ` [PATCH v4 01/10] gpio: mxc: fix race between chained IRQ handler install and probe completion Peng Fan (OSS)
2026-10-07 10:57 ` sashiko-bot
2026-10-08 9:44 ` Bartosz Golaszewski
2026-10-09 0:57 ` Peng Fan
2026-10-07 10:44 ` [PATCH v4 02/10] gpio: mxc: fix wakeup_pads bit operations Peng Fan (OSS)
2026-10-08 19:59 ` Frank Li
2026-10-09 0:59 ` Peng Fan
2026-10-07 10:44 ` [PATCH v4 03/10] gpio: mxc: use for_each_set_bit() to iterate wakeup pads Peng Fan (OSS)
2026-10-08 20:00 ` Frank Li
2026-10-07 10:44 ` [PATCH v4 04/10] gpio: mxc: replace of_device_is_compatible() with hwdata flags Peng Fan (OSS)
2026-10-08 20:05 ` Frank Li
2026-10-07 10:44 ` [PATCH v4 05/10] gpio: mxc: convert pad wakeup compatible checks to " Peng Fan (OSS)
2026-10-08 20:10 ` Frank Li
2026-10-09 1:00 ` Peng Fan
2026-10-07 10:44 ` [PATCH v4 06/10] gpio: mxc: convert probe error handling to devres Peng Fan (OSS)
2026-10-07 10:59 ` sashiko-bot
2026-10-08 9:47 ` Bartosz Golaszewski
2026-10-09 2:25 ` Peng Fan [this message]
2026-10-08 20:12 ` Frank Li
2026-10-09 2:18 ` Peng Fan
2026-10-07 10:44 ` [PATCH v4 07/10] gpio: mxc: switch probe error paths to dev_err_probe() Peng Fan (OSS)
2026-10-07 11:02 ` sashiko-bot
2026-10-08 20:15 ` Frank Li
2026-10-07 10:44 ` [PATCH v4 08/10] gpio: mxc: use local dev variable Peng Fan (OSS)
2026-10-07 11:03 ` sashiko-bot
2026-10-08 20:16 ` Frank Li
2026-10-07 10:44 ` [PATCH v4 09/10] gpio: mxc: introduce MXC_ICR macros and use field_prep/field_get Peng Fan (OSS)
2026-10-08 20:25 ` Frank Li
2026-10-07 10:44 ` [PATCH v4 10/10] gpio: mxc: use BIT() macro for single-bit operations Peng Fan (OSS)
2026-10-07 10:56 ` sashiko-bot
2026-10-09 2:32 ` Peng Fan
2026-10-08 20:26 ` Frank Li
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=ashQs4mmqF0ECg3D@shlinux89 \
--to=peng.fan@oss.nxp.com \
--cc=Frank.Li@kernel.org \
--cc=brgl@kernel.org \
--cc=imx@lists.linux.dev \
--cc=linux-gpio@vger.kernel.org \
--cc=sashiko-bot@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox