2021-04-17 13:26:17

by Adam Ford

[permalink] [raw]
Subject: [PATCH] net: ethernet: ravb: Fix release of refclk

The call to clk_disable_unprepare() can happen before priv is
initialized. This means moving clk_disable_unprepare out of
out_release into a new label.

Fixes: 8ef7adc6beb2("net: ethernet: ravb: Enable optional refclk")
Signed-off-by: Adam Ford <[email protected]>

diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index 8c84c40ab9a0..64a545c98ff2 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -2173,7 +2173,7 @@ static int ravb_probe(struct platform_device *pdev)
/* Set GTI value */
error = ravb_set_gti(ndev);
if (error)
- goto out_release;
+ goto out_unprepare_refclk;

/* Request GTI loading */
ravb_modify(ndev, GCCR, GCCR_LTI, GCCR_LTI);
@@ -2192,7 +2192,7 @@ static int ravb_probe(struct platform_device *pdev)
"Cannot allocate desc base address table (size %d bytes)\n",
priv->desc_bat_size);
error = -ENOMEM;
- goto out_release;
+ goto out_unprepare_refclk;
}
for (q = RAVB_BE; q < DBAT_ENTRY_NUM; q++)
priv->desc_bat[q].die_dt = DT_EOS;
@@ -2252,8 +2252,9 @@ static int ravb_probe(struct platform_device *pdev)
/* Stop PTP Clock driver */
if (chip_id != RCAR_GEN2)
ravb_ptp_stop(ndev);
-out_release:
+out_unprepare_refclk:
clk_disable_unprepare(priv->refclk);
+out_release:
free_netdev(ndev);

pm_runtime_put(&pdev->dev);
--
2.25.1


2021-04-19 09:18:49

by Geert Uytterhoeven

[permalink] [raw]
Subject: Re: [PATCH] net: ethernet: ravb: Fix release of refclk

On Sat, Apr 17, 2021 at 3:23 PM Adam Ford <[email protected]> wrote:
> The call to clk_disable_unprepare() can happen before priv is
> initialized. This means moving clk_disable_unprepare out of
> out_release into a new label.
>
> Fixes: 8ef7adc6beb2("net: ethernet: ravb: Enable optional refclk")
> Signed-off-by: Adam Ford <[email protected]>

Reviewed-by: Geert Uytterhoeven <[email protected]>

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]

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

2021-04-19 09:43:45

by Sergei Shtylyov

[permalink] [raw]
Subject: Re: [PATCH] net: ethernet: ravb: Fix release of refclk

Hello!

On 17.04.2021 16:23, Adam Ford wrote:

> The call to clk_disable_unprepare() can happen before priv is
> initialized.

Mhm, how's that? :-/

> This means moving clk_disable_unprepare out of
> out_release into a new label.
>
> Fixes: 8ef7adc6beb2("net: ethernet: ravb: Enable optional refclk")
> Signed-off-by: Adam Ford <[email protected]>
>
> diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
> index 8c84c40ab9a0..64a545c98ff2 100644
> --- a/drivers/net/ethernet/renesas/ravb_main.c
> +++ b/drivers/net/ethernet/renesas/ravb_main.c
[...]
> @@ -2252,8 +2252,9 @@ static int ravb_probe(struct platform_device *pdev)
> /* Stop PTP Clock driver */
> if (chip_id != RCAR_GEN2)
> ravb_ptp_stop(ndev);
> -out_release:
> +out_unprepare_refclk:

I'd really prefer out_disable_refclk.

> clk_disable_unprepare(priv->refclk);
> +out_release:
> free_netdev(ndev);
>
> pm_runtime_put(&pdev->dev);

MBR, Sergei

2021-04-19 22:46:34

by David Miller

[permalink] [raw]
Subject: Re: [PATCH] net: ethernet: ravb: Fix release of refclk

From: Adam Ford <[email protected]>
Date: Sat, 17 Apr 2021 08:23:29 -0500

> The call to clk_disable_unprepare() can happen before priv is
> initialized. This means moving clk_disable_unprepare out of
> out_release into a new label.
>
> Fixes: 8ef7adc6beb2("net: ethernet: ravb: Enable optional refclk")
> Signed-off-by: Adam Ford <[email protected]>
Thjis does not apply cleanly, please rebbase and resubmit.

Please fix the formatting of your Fixes tag while you are at it, thank you.

2021-04-20 03:34:01

by Adam Ford

[permalink] [raw]
Subject: Re: [PATCH] net: ethernet: ravb: Fix release of refclk

On Mon, Apr 19, 2021 at 5:45 PM David Miller <[email protected]> wrote:
>
> From: Adam Ford <[email protected]>
> Date: Sat, 17 Apr 2021 08:23:29 -0500
>
> > The call to clk_disable_unprepare() can happen before priv is
> > initialized. This means moving clk_disable_unprepare out of
> > out_release into a new label.
> >
> > Fixes: 8ef7adc6beb2("net: ethernet: ravb: Enable optional refclk")
> > Signed-off-by: Adam Ford <[email protected]>
> Thjis does not apply cleanly, please rebbase and resubmit.

Which branch should I use as the rebase? I used net-next because
that's where the bug is, but I know it changes frequently.

>
> Please fix the formatting of your Fixes tag while you are at it, thank you.

no problem. Sorry about that

adam

2021-04-21 19:06:01

by Sergei Shtylyov

[permalink] [raw]
Subject: Re: [PATCH] net: ethernet: ravb: Fix release of refclk

On 4/21/21 5:05 PM, Adam Ford wrote:

> The call to clk_disable_unprepare() can happen before priv is
> initialized.

This still doesn't make sense for me...

> This means moving clk_disable_unprepare out of
^ call
> out_release into a new label.
>
> Fixes: 8ef7adc6beb2 ("net: ethernet: ravb: Enable optional refclk")
> Signed-off-by: Adam Ford <[email protected]>

Reviewed-by: Sergei Shtylyov <[email protected]>


[...]

MBR, Sergei

2021-04-22 01:42:10

by Adam Ford

[permalink] [raw]
Subject: Re: [PATCH] net: ethernet: ravb: Fix release of refclk

On Wed, Apr 21, 2021 at 9:25 AM Sergei Shtylyov
<[email protected]> wrote:
>
> On 4/21/21 5:05 PM, Adam Ford wrote:
>
> > The call to clk_disable_unprepare() can happen before priv is
> > initialized.
>
> This still doesn't make sense for me...
>
I need an external reference clock enabled by a programmable clock so
I added functionality to turn it on. [1] When I did it, I was
reminded to disable the clock in the event of an the error condition.
I originally added a call to clk_disable_unprepare(priv->refclk)
under the label called out_release, but a bot responded to me that we
may jump to this error condition before priv is initialized.

This fix is supposed to create a new label so the errors that happen
after the refclk is initialized will get disabled, but any errors that
happen before the clock is initialized will handle errors like they
did before.

Does that help explain things better?

adam

[1] - https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=8ef7adc6beb2ef0bce83513dc9e4505e7b21e8c2

> > This means moving clk_disable_unprepare out of
> ^ call
> > out_release into a new label.
> >
> > Fixes: 8ef7adc6beb2 ("net: ethernet: ravb: Enable optional refclk")
> > Signed-off-by: Adam Ford <[email protected]>
>
> Reviewed-by: Sergei Shtylyov <[email protected]>
>
>
> [...]
>
> MBR, Sergei