* [PATCH v2] net: stmmac: add explicit check and error on invalid PTP clock rate
@ 2025-05-27 6:33 Alexis Lothoré
2025-05-27 16:31 ` Maxime Chevallier
0 siblings, 1 reply; 3+ messages in thread
From: Alexis Lothoré @ 2025-05-27 6:33 UTC (permalink / raw)
To: Alexandre Torgue, Jose Abreu, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Maxime Coquelin,
Richard Cochran, Phil Reid
Cc: Thomas Petazzoni, Maxime Chevallier, netdev, linux-stm32,
linux-arm-kernel, linux-kernel, Alexis Lothoré
The stmmac platform drivers that do not open-code the clk_ptp_rate value
after having retrieved the default one from the device-tree can end up
with 0 in clk_ptp_rate (as clk_get_rate can return 0). It will
eventually propagate up to PTP initialization when bringing up the
interface, leading to a divide by 0:
Division by zero in kernel.
CPU: 1 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.12.30-00001-g48313bd5768a #22
Hardware name: STM32 (Device Tree Support)
Call trace:
unwind_backtrace from show_stack+0x18/0x1c
show_stack from dump_stack_lvl+0x6c/0x8c
dump_stack_lvl from Ldiv0_64+0x8/0x18
Ldiv0_64 from stmmac_init_tstamp_counter+0x190/0x1a4
stmmac_init_tstamp_counter from stmmac_hw_setup+0xc1c/0x111c
stmmac_hw_setup from __stmmac_open+0x18c/0x434
__stmmac_open from stmmac_open+0x3c/0xbc
stmmac_open from __dev_open+0xf4/0x1ac
__dev_open from __dev_change_flags+0x1cc/0x224
__dev_change_flags from dev_change_flags+0x24/0x60
dev_change_flags from ip_auto_config+0x2e8/0x11a0
ip_auto_config from do_one_initcall+0x84/0x33c
do_one_initcall from kernel_init_freeable+0x1b8/0x214
kernel_init_freeable from kernel_init+0x24/0x140
kernel_init from ret_from_fork+0x14/0x28
Exception stack(0xe0815fb0 to 0xe0815ff8)
Prevent this division by 0 by adding an explicit check and error log
about the actual issue.
Fixes: 19d857c9038e ("stmmac: Fix calculations for ptp counters when clock input = 50Mhz.")
Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com>
---
Changes in v2:
- Add Fixes tag
- Reword commit message to clarify the triggering cause of the issue
- Link to v1: https://lore.kernel.org/r/20250523-stmmac_tstamp_div-v1-1-bca8a5a3a477@bootlin.com
---
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 918d7f2e8ba992208d7d6521a1e9dba01086058f..f68e3ece919cc88d0bf199a394bc7e44b5dee095 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -835,6 +835,11 @@ int stmmac_init_tstamp_counter(struct stmmac_priv *priv, u32 systime_flags)
if (!(priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp))
return -EOPNOTSUPP;
+ if (!priv->plat->clk_ptp_rate) {
+ netdev_err(priv->dev, "Invalid PTP clock rate");
+ return -EINVAL;
+ }
+
stmmac_config_hw_tstamping(priv, priv->ptpaddr, systime_flags);
priv->systime_flags = systime_flags;
---
base-commit: e0e2f78243385e7188a57fcfceb6a19f723f1dff
change-id: 20250522-stmmac_tstamp_div-f55112f06029
Best regards,
--
Alexis Lothoré, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH v2] net: stmmac: add explicit check and error on invalid PTP clock rate 2025-05-27 6:33 [PATCH v2] net: stmmac: add explicit check and error on invalid PTP clock rate Alexis Lothoré @ 2025-05-27 16:31 ` Maxime Chevallier 2025-05-28 8:06 ` Alexis Lothoré 0 siblings, 1 reply; 3+ messages in thread From: Maxime Chevallier @ 2025-05-27 16:31 UTC (permalink / raw) To: Alexis Lothoré Cc: Alexandre Torgue, Jose Abreu, Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Maxime Coquelin, Richard Cochran, Phil Reid, Thomas Petazzoni, netdev, linux-stm32, linux-arm-kernel, linux-kernel Hi Alexis, On Tue, 27 May 2025 08:33:44 +0200 Alexis Lothoré <alexis.lothore@bootlin.com> wrote: > The stmmac platform drivers that do not open-code the clk_ptp_rate value > after having retrieved the default one from the device-tree can end up > with 0 in clk_ptp_rate (as clk_get_rate can return 0). It will > eventually propagate up to PTP initialization when bringing up the > interface, leading to a divide by 0: > > Division by zero in kernel. > CPU: 1 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.12.30-00001-g48313bd5768a #22 > Hardware name: STM32 (Device Tree Support) > Call trace: > unwind_backtrace from show_stack+0x18/0x1c > show_stack from dump_stack_lvl+0x6c/0x8c > dump_stack_lvl from Ldiv0_64+0x8/0x18 > Ldiv0_64 from stmmac_init_tstamp_counter+0x190/0x1a4 > stmmac_init_tstamp_counter from stmmac_hw_setup+0xc1c/0x111c > stmmac_hw_setup from __stmmac_open+0x18c/0x434 > __stmmac_open from stmmac_open+0x3c/0xbc > stmmac_open from __dev_open+0xf4/0x1ac > __dev_open from __dev_change_flags+0x1cc/0x224 > __dev_change_flags from dev_change_flags+0x24/0x60 > dev_change_flags from ip_auto_config+0x2e8/0x11a0 > ip_auto_config from do_one_initcall+0x84/0x33c > do_one_initcall from kernel_init_freeable+0x1b8/0x214 > kernel_init_freeable from kernel_init+0x24/0x140 > kernel_init from ret_from_fork+0x14/0x28 > Exception stack(0xe0815fb0 to 0xe0815ff8) > > Prevent this division by 0 by adding an explicit check and error log > about the actual issue. > > Fixes: 19d857c9038e ("stmmac: Fix calculations for ptp counters when clock input = 50Mhz.") > Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com> > --- > Changes in v2: > - Add Fixes tag > - Reword commit message to clarify the triggering cause of the issue > - Link to v1: https://lore.kernel.org/r/20250523-stmmac_tstamp_div-v1-1-bca8a5a3a477@bootlin.com > --- > drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c > index 918d7f2e8ba992208d7d6521a1e9dba01086058f..f68e3ece919cc88d0bf199a394bc7e44b5dee095 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c > +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c > @@ -835,6 +835,11 @@ int stmmac_init_tstamp_counter(struct stmmac_priv *priv, u32 systime_flags) > if (!(priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp)) > return -EOPNOTSUPP; > > + if (!priv->plat->clk_ptp_rate) { > + netdev_err(priv->dev, "Invalid PTP clock rate"); > + return -EINVAL; > + } > + > stmmac_config_hw_tstamping(priv, priv->ptpaddr, systime_flags); > priv->systime_flags = systime_flags; This may be some nitpick that can be addressed at a later point, but we now have a guarantee that when stmmac_ptp_register() gets called, priv->ptp_clk_rate is non-zero, right ? If so, we can drop the test in said function : if (priv->plat->has_gmac4 && priv->plat->clk_ptp_rate) priv->plat->cdc_error_adj = (2 * NSEC_PER_SEC) / priv->plat->clk_ptp_rate; There is another spot in the code, like in the EST handling, where we divide by priv->plat->ptp_clk_rate : stmmac_adjust_time(...) stmmac_est_configure(priv, priv, priv->est, priv->plat->clk_ptp_rate) .est_configure() ctrl |= ((NSEC_PER_SEC / ptp_rate) [...] Maybe we should fail EST configuration as well if ptp_clk_rate is 0 (probably in stmmac_tc.c's tc_taprio_configure or in the .est_configure). That can be a step for later as well, as I don't know if the setup you found this bug on even supports taprio/EST, and setups that do didn't seem to encounter the bug yet. Besides all that, Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com> Thanks, Maxime ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v2] net: stmmac: add explicit check and error on invalid PTP clock rate 2025-05-27 16:31 ` Maxime Chevallier @ 2025-05-28 8:06 ` Alexis Lothoré 0 siblings, 0 replies; 3+ messages in thread From: Alexis Lothoré @ 2025-05-28 8:06 UTC (permalink / raw) To: Maxime Chevallier Cc: Alexandre Torgue, Jose Abreu, Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Maxime Coquelin, Richard Cochran, Phil Reid, Thomas Petazzoni, netdev, linux-stm32, linux-arm-kernel, linux-kernel Hey Maxime, On Tue May 27, 2025 at 6:31 PM CEST, Maxime Chevallier wrote: > Hi Alexis, > > On Tue, 27 May 2025 08:33:44 +0200 > Alexis Lothoré <alexis.lothore@bootlin.com> wrote: [...] >> + if (!priv->plat->clk_ptp_rate) { >> + netdev_err(priv->dev, "Invalid PTP clock rate"); >> + return -EINVAL; >> + } >> + >> stmmac_config_hw_tstamping(priv, priv->ptpaddr, systime_flags); >> priv->systime_flags = systime_flags; > > This may be some nitpick that can be addressed at a later point, but we > now have a guarantee that when stmmac_ptp_register() gets called, > priv->ptp_clk_rate is non-zero, right ? If so, we can drop the test in > said function : > > if (priv->plat->has_gmac4 && priv->plat->clk_ptp_rate) > priv->plat->cdc_error_adj = (2 * NSEC_PER_SEC) / priv->plat->clk_ptp_rate; You are right, my series makes this check a duplicate, I'll remove it. > There is another spot in the code, like in the EST handling, where we > divide by priv->plat->ptp_clk_rate : > > stmmac_adjust_time(...) > stmmac_est_configure(priv, priv, priv->est, > priv->plat->clk_ptp_rate) > .est_configure() > ctrl |= ((NSEC_PER_SEC / ptp_rate) [...] > > Maybe we should fail EST configuration as well if ptp_clk_rate is 0 > (probably in stmmac_tc.c's tc_taprio_configure or in the > .est_configure). That can be a step for later as well, as I don't know > if the setup you found this bug on even supports taprio/EST, and setups > that do didn't seem to encounter the bug yet. I guess you are right as well, it may not make sense to try to configure EST if we have a bogus clk_ptp_rate value. est_configure seems to be called in both tc_taprio_configure and stmmac_adjust_time, so I'll add the check in est_configure. Thanks, Alexis -- Alexis Lothoré, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-05-28 8:08 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-05-27 6:33 [PATCH v2] net: stmmac: add explicit check and error on invalid PTP clock rate Alexis Lothoré 2025-05-27 16:31 ` Maxime Chevallier 2025-05-28 8:06 ` Alexis Lothoré
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox