Hi Zhang, On Tue, Nov 10, 2020 at 10:29 AM Zhang Qilong <zhangqilo...@huawei.com> wrote: > In many case, we need to check return value of pm_runtime_get_sync, but > it brings a trouble to the usage counter processing. Many callers forget > to decrease the usage counter when it failed, which could resulted in > reference leak. It has been discussed a lot[0][1]. So we add a function > to deal with the usage counter for better coding. > > [0]https://lkml.org/lkml/2020/6/14/88 > [1]https://patchwork.ozlabs.org/project/linux-tegra/list/?series=178139 > Signed-off-by: Zhang Qilong <zhangqilo...@huawei.com>
Thanks for your patch, which is now commit dd8088d5a8969dc2 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter") in v5.10-rc5. > --- a/include/linux/pm_runtime.h > +++ b/include/linux/pm_runtime.h > @@ -386,6 +386,27 @@ static inline int pm_runtime_get_sync(struct device *dev) > return __pm_runtime_resume(dev, RPM_GET_PUT); > } > > +/** > + * pm_runtime_resume_and_get - Bump up usage counter of a device and resume > it. > + * @dev: Target device. > + * > + * Resume @dev synchronously and if that is successful, increment its runtime > + * PM usage counter. Return 0 if the runtime PM usage counter of @dev has > been > + * incremented or a negative error code otherwise. > + */ > +static inline int pm_runtime_resume_and_get(struct device *dev) Perhaps this function should be called pm_runtime_resume_and_get_sync(), to make it clear it does a synchronous get? I had to look into the implementation to verify that a change like - ret = pm_runtime_get_sync(&pdev->dev); + ret = pm_runtime_resume_and_get(&pdev->dev); in the follow-up patches is actually a valid change, maintaining synchronous operation. Oh, pm_runtime_resume() is synchronous, too... While I agree the old pm_runtime_get_sync() had confusing semantics, we should go to great lengths to avoid making the same mistake while fixing it. > +{ > + int ret; > + > + ret = __pm_runtime_resume(dev, RPM_GET_PUT); > + if (ret < 0) { > + pm_runtime_put_noidle(dev); > + return ret; > + } > + > + return 0; > +} > + > /** > * pm_runtime_put - Drop device usage counter and queue up "idle check" if 0. > * @dev: Target device. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds