2020-06-13 23:26:14

by Qiushi Wu

[permalink] [raw]
Subject: [PATCH] media: vsp1: Fix a reference count leak.

From: Qiushi Wu <[email protected]>

pm_runtime_get_sync() increments the runtime PM usage counter even
when it returns an error code, causing incorrect ref count if
pm_runtime_put_noidle() is not called in error handling paths.
Thus call pm_runtime_put_noidle() if pm_runtime_get_sync() fails.

Fixes: 1e6af546ee66 ("[media] v4l: vsp1: Implement runtime PM support")
Signed-off-by: Qiushi Wu <[email protected]>
---
drivers/media/platform/vsp1/vsp1_drv.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/media/platform/vsp1/vsp1_drv.c b/drivers/media/platform/vsp1/vsp1_drv.c
index c650e45bb0ad..222c9e1261a0 100644
--- a/drivers/media/platform/vsp1/vsp1_drv.c
+++ b/drivers/media/platform/vsp1/vsp1_drv.c
@@ -846,8 +846,10 @@ static int vsp1_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev);

ret = pm_runtime_get_sync(&pdev->dev);
- if (ret < 0)
+ if (ret < 0) {
+ pm_runtime_put_noidle(&pdev->dev);
goto done;
+ }

vsp1->version = vsp1_read(vsp1, VI6_IP_VERSION);
pm_runtime_put_sync(&pdev->dev);
--
2.17.1


2020-06-16 02:10:06

by Laurent Pinchart

[permalink] [raw]
Subject: Re: [PATCH] media: vsp1: Fix a reference count leak.

Hi Qiushi,

(CC'ing Rafael and Geert)

Thank you for the patch.

On Sat, Jun 13, 2020 at 06:23:57PM -0500, [email protected] wrote:
> From: Qiushi Wu <[email protected]>
>
> pm_runtime_get_sync() increments the runtime PM usage counter even
> when it returns an error code, causing incorrect ref count if
> pm_runtime_put_noidle() is not called in error handling paths.
> Thus call pm_runtime_put_noidle() if pm_runtime_get_sync() fails.
>
> Fixes: 1e6af546ee66 ("[media] v4l: vsp1: Implement runtime PM support")
> Signed-off-by: Qiushi Wu <[email protected]>

https://lore.kernel.org/dri-devel/[email protected]/

I really wonder if mass-patching all drivers is the best way forward.

> ---
> drivers/media/platform/vsp1/vsp1_drv.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/platform/vsp1/vsp1_drv.c b/drivers/media/platform/vsp1/vsp1_drv.c
> index c650e45bb0ad..222c9e1261a0 100644
> --- a/drivers/media/platform/vsp1/vsp1_drv.c
> +++ b/drivers/media/platform/vsp1/vsp1_drv.c
> @@ -846,8 +846,10 @@ static int vsp1_probe(struct platform_device *pdev)
> pm_runtime_enable(&pdev->dev);
>
> ret = pm_runtime_get_sync(&pdev->dev);
> - if (ret < 0)
> + if (ret < 0) {
> + pm_runtime_put_noidle(&pdev->dev);
> goto done;
> + }
>
> vsp1->version = vsp1_read(vsp1, VI6_IP_VERSION);
> pm_runtime_put_sync(&pdev->dev);

--
Regards,

Laurent Pinchart

2020-06-16 02:12:36

by Laurent Pinchart

[permalink] [raw]
Subject: Re: [PATCH] media: vsp1: Fix a reference count leak.

On Tue, Jun 16, 2020 at 05:07:34AM +0300, Laurent Pinchart wrote:
> Hi Qiushi,
>
> (CC'ing Rafael and Geert)
>
> Thank you for the patch.
>
> On Sat, Jun 13, 2020 at 06:23:57PM -0500, [email protected] wrote:
> > From: Qiushi Wu <[email protected]>
> >
> > pm_runtime_get_sync() increments the runtime PM usage counter even
> > when it returns an error code, causing incorrect ref count if
> > pm_runtime_put_noidle() is not called in error handling paths.
> > Thus call pm_runtime_put_noidle() if pm_runtime_get_sync() fails.
> >
> > Fixes: 1e6af546ee66 ("[media] v4l: vsp1: Implement runtime PM support")
> > Signed-off-by: Qiushi Wu <[email protected]>
>
> https://lore.kernel.org/dri-devel/[email protected]/
>
> I really wonder if mass-patching all drivers is the best way forward.

Also,

https://lore.kernel.org/linux-media/[email protected]/

> > ---
> > drivers/media/platform/vsp1/vsp1_drv.c | 4 +++-
> > 1 file changed, 3 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/media/platform/vsp1/vsp1_drv.c b/drivers/media/platform/vsp1/vsp1_drv.c
> > index c650e45bb0ad..222c9e1261a0 100644
> > --- a/drivers/media/platform/vsp1/vsp1_drv.c
> > +++ b/drivers/media/platform/vsp1/vsp1_drv.c
> > @@ -846,8 +846,10 @@ static int vsp1_probe(struct platform_device *pdev)
> > pm_runtime_enable(&pdev->dev);
> >
> > ret = pm_runtime_get_sync(&pdev->dev);
> > - if (ret < 0)
> > + if (ret < 0) {
> > + pm_runtime_put_noidle(&pdev->dev);
> > goto done;
> > + }
> >
> > vsp1->version = vsp1_read(vsp1, VI6_IP_VERSION);
> > pm_runtime_put_sync(&pdev->dev);

--
Regards,

Laurent Pinchart

2020-06-22 10:24:43

by Hans Verkuil

[permalink] [raw]
Subject: Re: [PATCH] media: vsp1: Fix a reference count leak.

On 16/06/2020 04:09, Laurent Pinchart wrote:
> On Tue, Jun 16, 2020 at 05:07:34AM +0300, Laurent Pinchart wrote:
>> Hi Qiushi,
>>
>> (CC'ing Rafael and Geert)
>>
>> Thank you for the patch.
>>
>> On Sat, Jun 13, 2020 at 06:23:57PM -0500, [email protected] wrote:
>>> From: Qiushi Wu <[email protected]>
>>>
>>> pm_runtime_get_sync() increments the runtime PM usage counter even
>>> when it returns an error code, causing incorrect ref count if
>>> pm_runtime_put_noidle() is not called in error handling paths.
>>> Thus call pm_runtime_put_noidle() if pm_runtime_get_sync() fails.
>>>
>>> Fixes: 1e6af546ee66 ("[media] v4l: vsp1: Implement runtime PM support")
>>> Signed-off-by: Qiushi Wu <[email protected]>
>>
>> https://lore.kernel.org/dri-devel/[email protected]/
>>
>> I really wonder if mass-patching all drivers is the best way forward.
>
> Also,
>
> https://lore.kernel.org/linux-media/[email protected]/

I also stop applying these patches. In part because of what Laurent says (I'd
like to have some consensus on this as well), and in part because there are
at least three different devs working on this (Qiushi Wu <[email protected]>,
Aditya Pakki <[email protected]> and Dinghao Liu <[email protected]>) and
I am getting duplicate patches.

So I stop applying these pm_runtime_get_sync() patches until it is clear that
this is the way forward. Other ref count issues I will still apply, but it
would be great if Qiushi Wu, Aditya Pakki and Dinghao Liu can work together
to avoid duplicate patches.

Regards,

Hans

>
>>> ---
>>> drivers/media/platform/vsp1/vsp1_drv.c | 4 +++-
>>> 1 file changed, 3 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/media/platform/vsp1/vsp1_drv.c b/drivers/media/platform/vsp1/vsp1_drv.c
>>> index c650e45bb0ad..222c9e1261a0 100644
>>> --- a/drivers/media/platform/vsp1/vsp1_drv.c
>>> +++ b/drivers/media/platform/vsp1/vsp1_drv.c
>>> @@ -846,8 +846,10 @@ static int vsp1_probe(struct platform_device *pdev)
>>> pm_runtime_enable(&pdev->dev);
>>>
>>> ret = pm_runtime_get_sync(&pdev->dev);
>>> - if (ret < 0)
>>> + if (ret < 0) {
>>> + pm_runtime_put_noidle(&pdev->dev);
>>> goto done;
>>> + }
>>>
>>> vsp1->version = vsp1_read(vsp1, VI6_IP_VERSION);
>>> pm_runtime_put_sync(&pdev->dev);
>