2022-08-18 20:47:28

by Nicolas Dufresne

[permalink] [raw]
Subject: [PATCH v1 2/3] media: cedrus: Set the platform driver data earlier

From: Dmitry Osipenko <[email protected]>

The cedrus_hw_resume() crashes with NULL deference on driver probe if
runtime PM is disabled because it uses platform data that hasn't been
set up yet. Fix this by setting the platform data earlier during probe.

Cc: [email protected]
Signed-off-by: Dmitry Osipenko <[email protected]>
Signed-off-by: Nicolas Dufresne <[email protected]>
---
drivers/staging/media/sunxi/cedrus/cedrus.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c
index 960a0130cd620..55c54dfdc585c 100644
--- a/drivers/staging/media/sunxi/cedrus/cedrus.c
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
@@ -448,6 +448,8 @@ static int cedrus_probe(struct platform_device *pdev)
if (!dev)
return -ENOMEM;

+ platform_set_drvdata(pdev, dev);
+
dev->vfd = cedrus_video_device;
dev->dev = &pdev->dev;
dev->pdev = pdev;
@@ -521,8 +523,6 @@ static int cedrus_probe(struct platform_device *pdev)
goto err_m2m_mc;
}

- platform_set_drvdata(pdev, dev);
-
return 0;

err_m2m_mc:
--
2.37.2


2022-08-19 04:29:49

by Jernej Škrabec

[permalink] [raw]
Subject: Re: [PATCH v1 2/3] media: cedrus: Set the platform driver data earlier

Dne četrtek, 18. avgust 2022 ob 22:33:07 CEST je Nicolas Dufresne napisal(a):
> From: Dmitry Osipenko <[email protected]>
>
> The cedrus_hw_resume() crashes with NULL deference on driver probe if
> runtime PM is disabled because it uses platform data that hasn't been
> set up yet. Fix this by setting the platform data earlier during probe.

Does it even work without PM? Maybe it would be better if Cedrus would select
PM in Kconfig.

Best regards,
Jernej

>
> Cc: [email protected]
> Signed-off-by: Dmitry Osipenko <[email protected]>
> Signed-off-by: Nicolas Dufresne <[email protected]>
> ---
> drivers/staging/media/sunxi/cedrus/cedrus.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c
> b/drivers/staging/media/sunxi/cedrus/cedrus.c index
> 960a0130cd620..55c54dfdc585c 100644
> --- a/drivers/staging/media/sunxi/cedrus/cedrus.c
> +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
> @@ -448,6 +448,8 @@ static int cedrus_probe(struct platform_device *pdev)
> if (!dev)
> return -ENOMEM;
>
> + platform_set_drvdata(pdev, dev);
> +
> dev->vfd = cedrus_video_device;
> dev->dev = &pdev->dev;
> dev->pdev = pdev;
> @@ -521,8 +523,6 @@ static int cedrus_probe(struct platform_device *pdev)
> goto err_m2m_mc;
> }
>
> - platform_set_drvdata(pdev, dev);
> -
> return 0;
>
> err_m2m_mc:




2022-08-19 17:35:32

by Nicolas Dufresne

[permalink] [raw]
Subject: Re: [PATCH v1 2/3] media: cedrus: Set the platform driver data earlier

Le vendredi 19 août 2022 à 06:17 +0200, Jernej Škrabec a écrit :
> Dne četrtek, 18. avgust 2022 ob 22:33:07 CEST je Nicolas Dufresne napisal(a):
> > From: Dmitry Osipenko <[email protected]>
> >
> > The cedrus_hw_resume() crashes with NULL deference on driver probe if
> > runtime PM is disabled because it uses platform data that hasn't been
> > set up yet. Fix this by setting the platform data earlier during probe.
>
> Does it even work without PM? Maybe it would be better if Cedrus would select
> PM in Kconfig.

I cannot comment myself on this, but it does not seem to invalidate this
Dmitry's fix.

>
> Best regards,
> Jernej
>
> >
> > Cc: [email protected]
> > Signed-off-by: Dmitry Osipenko <[email protected]>
> > Signed-off-by: Nicolas Dufresne <[email protected]>
> > ---
> > drivers/staging/media/sunxi/cedrus/cedrus.c | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c
> > b/drivers/staging/media/sunxi/cedrus/cedrus.c index
> > 960a0130cd620..55c54dfdc585c 100644
> > --- a/drivers/staging/media/sunxi/cedrus/cedrus.c
> > +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
> > @@ -448,6 +448,8 @@ static int cedrus_probe(struct platform_device *pdev)
> > if (!dev)
> > return -ENOMEM;
> >
> > + platform_set_drvdata(pdev, dev);
> > +
> > dev->vfd = cedrus_video_device;
> > dev->dev = &pdev->dev;
> > dev->pdev = pdev;
> > @@ -521,8 +523,6 @@ static int cedrus_probe(struct platform_device *pdev)
> > goto err_m2m_mc;
> > }
> >
> > - platform_set_drvdata(pdev, dev);
> > -
> > return 0;
> >
> > err_m2m_mc:
>
>
>
>

2022-08-20 08:31:34

by Jernej Škrabec

[permalink] [raw]
Subject: Re: [PATCH v1 2/3] media: cedrus: Set the platform driver data earlier

Dne petek, 19. avgust 2022 ob 17:37:20 CEST je Nicolas Dufresne napisal(a):
> Le vendredi 19 août 2022 à 06:17 +0200, Jernej Škrabec a écrit :
> > Dne četrtek, 18. avgust 2022 ob 22:33:07 CEST je Nicolas Dufresne
napisal(a):
> > > From: Dmitry Osipenko <[email protected]>
> > >
> > > The cedrus_hw_resume() crashes with NULL deference on driver probe if
> > > runtime PM is disabled because it uses platform data that hasn't been
> > > set up yet. Fix this by setting the platform data earlier during probe.
> >
> > Does it even work without PM? Maybe it would be better if Cedrus would
> > select PM in Kconfig.
>
> I cannot comment myself on this, but it does not seem to invalidate this
> Dmitry's fix.

If NULL pointer dereference happens only when PM is disabled, then it does. I
have PM always enabled and I never experienced above issue.

Best regards,
Jernej

>
> > Best regards,
> > Jernej
> >
> > > Cc: [email protected]
> > > Signed-off-by: Dmitry Osipenko <[email protected]>
> > > Signed-off-by: Nicolas Dufresne <[email protected]>
> > > ---
> > >
> > > drivers/staging/media/sunxi/cedrus/cedrus.c | 4 ++--
> > > 1 file changed, 2 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c
> > > b/drivers/staging/media/sunxi/cedrus/cedrus.c index
> > > 960a0130cd620..55c54dfdc585c 100644
> > > --- a/drivers/staging/media/sunxi/cedrus/cedrus.c
> > > +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
> > > @@ -448,6 +448,8 @@ static int cedrus_probe(struct platform_device
> > > *pdev)
> > >
> > > if (!dev)
> > >
> > > return -ENOMEM;
> > >
> > > + platform_set_drvdata(pdev, dev);
> > > +
> > >
> > > dev->vfd = cedrus_video_device;
> > > dev->dev = &pdev->dev;
> > > dev->pdev = pdev;
> > >
> > > @@ -521,8 +523,6 @@ static int cedrus_probe(struct platform_device
> > > *pdev)
> > >
> > > goto err_m2m_mc;
> > >
> > > }
> > >
> > > - platform_set_drvdata(pdev, dev);
> > > -
> > >
> > > return 0;
> > >
> > > err_m2m_mc:




2022-08-21 21:10:31

by Dmitry Osipenko

[permalink] [raw]
Subject: Re: [PATCH v1 2/3] media: cedrus: Set the platform driver data earlier

On 8/20/22 11:25, Jernej Škrabec wrote:
> Dne petek, 19. avgust 2022 ob 17:37:20 CEST je Nicolas Dufresne napisal(a):
>> Le vendredi 19 août 2022 à 06:17 +0200, Jernej Škrabec a écrit :
>>> Dne četrtek, 18. avgust 2022 ob 22:33:07 CEST je Nicolas Dufresne
> napisal(a):
>>>> From: Dmitry Osipenko <[email protected]>
>>>>
>>>> The cedrus_hw_resume() crashes with NULL deference on driver probe if
>>>> runtime PM is disabled because it uses platform data that hasn't been
>>>> set up yet. Fix this by setting the platform data earlier during probe.
>>>
>>> Does it even work without PM? Maybe it would be better if Cedrus would
>>> select PM in Kconfig.
>>
>> I cannot comment myself on this, but it does not seem to invalidate this
>> Dmitry's fix.
>
> If NULL pointer dereference happens only when PM is disabled, then it does. I
> have PM always enabled and I never experienced above issue.

Originally this fix was needed when I changed cedrus_hw_probe() to do
the rpm-resume while was debugging the hang issue and then also noticed
that the !PM should be broken. It's a good common practice for all
drivers to have the drv data set early to avoid such problems, hence it
won't hurt to make this change anyways.

In practice nobody disables PM other than for debugging purposes and !PM
handling is often broken in drivers. I assume that it might be even
better to enable PM for all Allwiner SoCs and remove !PM handling from
all the affected drivers, like it was done for Tegra some time ago.

--
Best regards,
Dmitry

2022-08-23 04:22:53

by Samuel Holland

[permalink] [raw]
Subject: Re: [PATCH v1 2/3] media: cedrus: Set the platform driver data earlier

On 8/20/22 3:25 AM, Jernej Škrabec wrote:
> Dne petek, 19. avgust 2022 ob 17:37:20 CEST je Nicolas Dufresne napisal(a):
>> Le vendredi 19 août 2022 à 06:17 +0200, Jernej Škrabec a écrit :
>>> Dne četrtek, 18. avgust 2022 ob 22:33:07 CEST je Nicolas Dufresne
> napisal(a):
>>>> From: Dmitry Osipenko <[email protected]>
>>>>
>>>> The cedrus_hw_resume() crashes with NULL deference on driver probe if
>>>> runtime PM is disabled because it uses platform data that hasn't been
>>>> set up yet. Fix this by setting the platform data earlier during probe.
>>>
>>> Does it even work without PM? Maybe it would be better if Cedrus would
>>> select PM in Kconfig.
>>
>> I cannot comment myself on this, but it does not seem to invalidate this
>> Dmitry's fix.
>
> If NULL pointer dereference happens only when PM is disabled, then it does. I
> have PM always enabled and I never experienced above issue.

There's still a bug even with PM enabled: the v4l2 device is exposed to
userspace, and therefore userspace could trigger a PM resume, before
platform_set_drvdata() is called.

>>>> Cc: [email protected]
>>>> Signed-off-by: Dmitry Osipenko <[email protected]>
>>>> Signed-off-by: Nicolas Dufresne <[email protected]>

Please add a Fixes tag. With that:

Reviewed-by: Samuel Holland <[email protected]>

>>>> ---
>>>>
>>>> drivers/staging/media/sunxi/cedrus/cedrus.c | 4 ++--
>>>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c
>>>> b/drivers/staging/media/sunxi/cedrus/cedrus.c index
>>>> 960a0130cd620..55c54dfdc585c 100644
>>>> --- a/drivers/staging/media/sunxi/cedrus/cedrus.c
>>>> +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
>>>> @@ -448,6 +448,8 @@ static int cedrus_probe(struct platform_device
>>>> *pdev)
>>>>
>>>> if (!dev)
>>>> return -ENOMEM;
>>>>
>>>> + platform_set_drvdata(pdev, dev);
>>>> +
>>>> dev->vfd = cedrus_video_device;
>>>> dev->dev = &pdev->dev;
>>>> dev->pdev = pdev;
>>>>
>>>> @@ -521,8 +523,6 @@ static int cedrus_probe(struct platform_device
>>>> *pdev)
>>>>
>>>> goto err_m2m_mc;
>>>> }
>>>>
>>>> - platform_set_drvdata(pdev, dev);
>>>> -
>>>> return 0;
>>>>
>>>> err_m2m_mc:

2022-08-23 15:09:23

by Paul Kocialkowski

[permalink] [raw]
Subject: Re: [PATCH v1 2/3] media: cedrus: Set the platform driver data earlier

Hi,

On Mon 22 Aug 22, 22:57, Samuel Holland wrote:
> On 8/20/22 3:25 AM, Jernej Škrabec wrote:
> > Dne petek, 19. avgust 2022 ob 17:37:20 CEST je Nicolas Dufresne napisal(a):
> >> Le vendredi 19 août 2022 à 06:17 +0200, Jernej Škrabec a écrit :
> >>> Dne četrtek, 18. avgust 2022 ob 22:33:07 CEST je Nicolas Dufresne
> > napisal(a):
> >>>> From: Dmitry Osipenko <[email protected]>
> >>>>
> >>>> The cedrus_hw_resume() crashes with NULL deference on driver probe if
> >>>> runtime PM is disabled because it uses platform data that hasn't been
> >>>> set up yet. Fix this by setting the platform data earlier during probe.
> >>>
> >>> Does it even work without PM? Maybe it would be better if Cedrus would
> >>> select PM in Kconfig.
> >>
> >> I cannot comment myself on this, but it does not seem to invalidate this
> >> Dmitry's fix.
> >
> > If NULL pointer dereference happens only when PM is disabled, then it does. I
> > have PM always enabled and I never experienced above issue.
>
> There's still a bug even with PM enabled: the v4l2 device is exposed to
> userspace, and therefore userspace could trigger a PM resume, before
> platform_set_drvdata() is called.

Absolutely agreed!

> >>>> Cc: [email protected]
> >>>> Signed-off-by: Dmitry Osipenko <[email protected]>
> >>>> Signed-off-by: Nicolas Dufresne <[email protected]>
>
> Please add a Fixes tag. With that:
>
> Reviewed-by: Samuel Holland <[email protected]>

Same here:

Acked-by: Paul Kocialkowski <[email protected]>

Thanks!

Paul

> >>>> ---
> >>>>
> >>>> drivers/staging/media/sunxi/cedrus/cedrus.c | 4 ++--
> >>>> 1 file changed, 2 insertions(+), 2 deletions(-)
> >>>>
> >>>> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c
> >>>> b/drivers/staging/media/sunxi/cedrus/cedrus.c index
> >>>> 960a0130cd620..55c54dfdc585c 100644
> >>>> --- a/drivers/staging/media/sunxi/cedrus/cedrus.c
> >>>> +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
> >>>> @@ -448,6 +448,8 @@ static int cedrus_probe(struct platform_device
> >>>> *pdev)
> >>>>
> >>>> if (!dev)
> >>>> return -ENOMEM;
> >>>>
> >>>> + platform_set_drvdata(pdev, dev);
> >>>> +
> >>>> dev->vfd = cedrus_video_device;
> >>>> dev->dev = &pdev->dev;
> >>>> dev->pdev = pdev;
> >>>>
> >>>> @@ -521,8 +523,6 @@ static int cedrus_probe(struct platform_device
> >>>> *pdev)
> >>>>
> >>>> goto err_m2m_mc;
> >>>> }
> >>>>
> >>>> - platform_set_drvdata(pdev, dev);
> >>>> -
> >>>> return 0;
> >>>>
> >>>> err_m2m_mc:

--
Paul Kocialkowski, Bootlin
Embedded Linux and kernel engineering
https://bootlin.com


Attachments:
(No filename) (2.65 kB)
signature.asc (499.00 B)
Download all attachments

2022-08-25 21:32:24

by Jernej Škrabec

[permalink] [raw]
Subject: Re: Re: [PATCH v1 2/3] media: cedrus: Set the platform driver data earlier

Dne nedelja, 21. avgust 2022 ob 22:40:21 CEST je Dmitry Osipenko napisal(a):
> On 8/20/22 11:25, Jernej Škrabec wrote:
> > Dne petek, 19. avgust 2022 ob 17:37:20 CEST je Nicolas Dufresne
napisal(a):
> >> Le vendredi 19 août 2022 à 06:17 +0200, Jernej Škrabec a écrit :
> >>> Dne četrtek, 18. avgust 2022 ob 22:33:07 CEST je Nicolas Dufresne
> >
> > napisal(a):
> >>>> From: Dmitry Osipenko <[email protected]>
> >>>>
> >>>> The cedrus_hw_resume() crashes with NULL deference on driver probe if
> >>>> runtime PM is disabled because it uses platform data that hasn't been
> >>>> set up yet. Fix this by setting the platform data earlier during probe.
> >>>
> >>> Does it even work without PM? Maybe it would be better if Cedrus would
> >>> select PM in Kconfig.
> >>
> >> I cannot comment myself on this, but it does not seem to invalidate this
> >> Dmitry's fix.
> >
> > If NULL pointer dereference happens only when PM is disabled, then it
> > does. I have PM always enabled and I never experienced above issue.
>
> Originally this fix was needed when I changed cedrus_hw_probe() to do
> the rpm-resume while was debugging the hang issue and then also noticed
> that the !PM should be broken. It's a good common practice for all
> drivers to have the drv data set early to avoid such problems, hence it
> won't hurt to make this change anyways.

Ok, as others pointed out, this is still a good thing, so:

Acked-by: Jernej Skrabec <[email protected]>


>
> In practice nobody disables PM other than for debugging purposes and !PM
> handling is often broken in drivers. I assume that it might be even
> better to enable PM for all Allwiner SoCs and remove !PM handling from
> all the affected drivers, like it was done for Tegra some time ago.
>

Maybe in the future :)

Best regards,
Jernej

> --
> Best regards,
> Dmitry