Re: [PATCH] watchdog: starfive: fix runtime PM usage counter leak in pm_start
Guenter Roeck <[email protected]>
| Newsgroups | org.kernel.vger.linux-watchdog |
|---|---|
| Message-ID | <[email protected]> |
On 8/23/26 04:22, manushprajwal wrote: > starfive_wdt_pm_start() calls pm_runtime_get_sync() and returns its > error code directly on failure. Per Documentation/power/runtime_pm.rst, > pm_runtime_get_sync() does not drop the usage counter on error, so the > caller is expected to release the reference itself. The early return > here skips that, leaking a runtime PM usage count on wdd->parent on > every failed resume, which prevents the device from being suspended > correctly afterwards. > > Fix it by calling pm_runtime_put_noidle() before returning, mirroring > the same balance the counterpart starfive_wdt_pm_stop() already > maintains with pm_runtime_put_sync(). > > Signed-off-by: manushprajwal <[email protected]> > --- > drivers/watchdog/starfive-wdt.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/watchdog/starfive-wdt.c b/drivers/watchdog/starfive-wdt.c > index af55adc4a..ecb704b2e 100644 > --- a/drivers/watchdog/starfive-wdt.c > +++ b/drivers/watchdog/starfive-wdt.c > @@ -373,8 +373,10 @@ static int starfive_wdt_pm_start(struct watchdog_device *wdd) > struct starfive_wdt *wdt = watchdog_get_drvdata(wdd); > int ret = pm_runtime_get_sync(wdd->parent); > > - if (ret < 0) > + if (ret < 0) { > + pm_runtime_put_noidle(wdd->parent); > return ret; > + } > > return starfive_wdt_start(wdt); > } As Sashiko points out, there is still a runtime PM leak if starfive_wdt_start() fails (plus all the other issues in the driver, but those can be fixed with separate patches). Thanks, Guenter