Re: [PATCH] iio: proximity: srf04: fix runtime PM autosuspend cleanup

Jonathan Cameron <[email protected]>
Newsgroups org.kernel.vger.linux-iio,org.kernel.vger.linux-kernel
Message-ID <20260808004129.53eafdd9@jic23-huawei>
On Fri,  7 Aug 2026 22:19:37 +0800
Guangshuo Li <[email protected]> wrote:

> srf04_probe() calls pm_runtime_use_autosuspend() when the optional
> power GPIO is present, but srf04_remove() does not call the matching
> pm_runtime_dont_use_autosuspend() before disabling runtime PM.
> 
> The runtime PM documentation requires pm_runtime_use_autosuspend() to
> be balanced with pm_runtime_dont_use_autosuspend() when the driver is
> removed. Failing to do so can leave the autosuspend usage state
> unbalanced and may result in a usage_count leak when the autosuspend
> delay is negative.
> 
> Add the missing pm_runtime_dont_use_autosuspend() call in the remove
> path before disabling runtime PM.
> 
> This issue was found by manual code inspection.

A cleaner solution may be to move to devm_pm_runtime_set_active_enabled()
though I am slightly concerned by the ordering here where in probe
we do iio_device_register() then runtime pm setup.
Remove would generally be the reverse order but instead it
does iio_device_unregister() the the runtime pm teardown.

That complicates matters and I can't see why we need to do that.
Do take a close look to see if you can see any reason this might be done.

I think easiest is move runtime pm registration before iio_device_register(),
using devm_pm_runtime_set_active_enabled() and ripping out all the calls
that effectively replaces.

Then a follow up patch to move to devm_iio_device_register() and drop
remove() entirely.

Looks like I missed this odd ordering when reviewing back in 2020.
oops.

Thanks,

Jonathan


> 
> Fixes: 2251157b335b4 ("iio: srf04: add power management feature")
> Signed-off-by: Guangshuo Li <[email protected]>
> ---
>  drivers/iio/proximity/srf04.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/iio/proximity/srf04.c b/drivers/iio/proximity/srf04.c
> index 7be50bdebfcb..5f270f506803 100644
> --- a/drivers/iio/proximity/srf04.c
> +++ b/drivers/iio/proximity/srf04.c
> @@ -347,6 +347,7 @@ static void srf04_remove(struct platform_device *pdev)
>  	iio_device_unregister(indio_dev);
>  
>  	if (data->gpiod_power) {
> +		pm_runtime_dont_use_autosuspend(data->dev);
>  		pm_runtime_disable(data->dev);
>  		pm_runtime_set_suspended(data->dev);
>  	}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.