Re: [PATCH 13/25] media: rcar_fdp1: fix pm_runtime_get_sync() usage count

From: Jonathan Cameron
Date: Wed May 05 2021 - 08:33:00 EST


On Wed, 5 May 2021 11:42:03 +0200
Mauro Carvalho Chehab <mchehab+huawei@xxxxxxxxxx> wrote:

> The pm_runtime_get_sync() internally increments the
> dev->power.usage_count without decrementing it, even on errors.
> Replace it by the new pm_runtime_resume_and_get(), introduced by:
> commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter")
> in order to properly decrement the usage counter, avoiding
> a potential PM usage counter leak.
>
> Also, right now, the driver is ignoring any troubles when
> trying to do PM resume. So, add the proper error handling
> for the code.
>
> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@xxxxxxxxxx>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx>
> ---
> drivers/media/platform/rcar_fdp1.c | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/media/platform/rcar_fdp1.c b/drivers/media/platform/rcar_fdp1.c
> index d26413fa5205..89aac60066d9 100644
> --- a/drivers/media/platform/rcar_fdp1.c
> +++ b/drivers/media/platform/rcar_fdp1.c
> @@ -2135,7 +2135,9 @@ static int fdp1_open(struct file *file)
> }
>
> /* Perform any power management required */
> - pm_runtime_get_sync(fdp1->dev);
> + ret = pm_runtime_resume_and_get(fdp1->dev);
> + if (ret < 0)
> + goto error_pm;
>
> v4l2_fh_add(&ctx->fh);
>
> @@ -2145,6 +2147,8 @@ static int fdp1_open(struct file *file)
> mutex_unlock(&fdp1->dev_mutex);
> return 0;
>
> +error_pm:
> + v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
> error_ctx:
> v4l2_ctrl_handler_free(&ctx->hdl);
> kfree(ctx);
> @@ -2352,7 +2356,9 @@ static int fdp1_probe(struct platform_device *pdev)
>
> /* Power up the cells to read HW */
> pm_runtime_enable(&pdev->dev);
> - pm_runtime_get_sync(fdp1->dev);
> + ret = pm_runtime_resume_and_get(fdp1->dev);
> + if (ret < 0)
> + goto disable_pm;
>
> hw_version = fdp1_read(fdp1, FD1_IP_INTDATA);
> switch (hw_version) {
> @@ -2381,6 +2387,9 @@ static int fdp1_probe(struct platform_device *pdev)
>
> return 0;
>
> +disable_pm:
> + pm_runtime_disable(fdp1->dev);
> +
> release_m2m:
> v4l2_m2m_release(fdp1->m2m_dev);
>