2024-05-21 02:51:19

by Wei Fang

[permalink] [raw]
Subject: [PATCH v2 net] net: fec: avoid lock evasion when reading pps_enable

The assignment of pps_enable is protected by tmreg_lock, but the read
operation of pps_enable is not. So the Coverity tool reports a lock
evasion warning which may cause data race to occur when running in a
multithread environment. Although this issue is almost impossible to
occur, we'd better fix it, at least it seems more logically reasonable,
and it also prevents Coverity from continuing to issue warnings.

Fixes: 278d24047891 ("net: fec: ptp: Enable PPS output based on ptp clock")
Signed-off-by: Wei Fang <[email protected]>
---
V2 changes:
Moved the assignment positions of pps_channel and reload_period.
---
drivers/net/ethernet/freescale/fec_ptp.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fec_ptp.c b/drivers/net/ethernet/freescale/fec_ptp.c
index 181d9bfbee22..e32f6724f568 100644
--- a/drivers/net/ethernet/freescale/fec_ptp.c
+++ b/drivers/net/ethernet/freescale/fec_ptp.c
@@ -104,14 +104,13 @@ static int fec_ptp_enable_pps(struct fec_enet_private *fep, uint enable)
struct timespec64 ts;
u64 ns;

- if (fep->pps_enable == enable)
- return 0;
-
- fep->pps_channel = DEFAULT_PPS_CHANNEL;
- fep->reload_period = PPS_OUPUT_RELOAD_PERIOD;
-
spin_lock_irqsave(&fep->tmreg_lock, flags);

+ if (fep->pps_enable == enable) {
+ spin_unlock_irqrestore(&fep->tmreg_lock, flags);
+ return 0;
+ }
+
if (enable) {
/* clear capture or output compare interrupt status if have.
*/
@@ -532,6 +531,9 @@ static int fec_ptp_enable(struct ptp_clock_info *ptp,
int ret = 0;

if (rq->type == PTP_CLK_REQ_PPS) {
+ fep->pps_channel = DEFAULT_PPS_CHANNEL;
+ fep->reload_period = PPS_OUPUT_RELOAD_PERIOD;
+
ret = fec_ptp_enable_pps(fep, on);

return ret;
--
2.34.1



2024-05-23 09:15:13

by Paolo Abeni

[permalink] [raw]
Subject: Re: [PATCH v2 net] net: fec: avoid lock evasion when reading pps_enable

On Tue, 2024-05-21 at 10:38 +0800, Wei Fang wrote:
> The assignment of pps_enable is protected by tmreg_lock, but the read
> operation of pps_enable is not. So the Coverity tool reports a lock
> evasion warning which may cause data race to occur when running in a
> multithread environment. Although this issue is almost impossible to
> occur, we'd better fix it, at least it seems more logically reasonable,
> and it also prevents Coverity from continuing to issue warnings.
>
> Fixes: 278d24047891 ("net: fec: ptp: Enable PPS output based on ptp clock")
> Signed-off-by: Wei Fang <[email protected]>
> ---
> V2 changes:
> Moved the assignment positions of pps_channel and reload_period.
> ---
> drivers/net/ethernet/freescale/fec_ptp.c | 14 ++++++++------
> 1 file changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/fec_ptp.c b/drivers/net/ethernet/freescale/fec_ptp.c
> index 181d9bfbee22..e32f6724f568 100644
> --- a/drivers/net/ethernet/freescale/fec_ptp.c
> +++ b/drivers/net/ethernet/freescale/fec_ptp.c
> @@ -104,14 +104,13 @@ static int fec_ptp_enable_pps(struct fec_enet_private *fep, uint enable)
> struct timespec64 ts;
> u64 ns;
>
> - if (fep->pps_enable == enable)
> - return 0;
> -
> - fep->pps_channel = DEFAULT_PPS_CHANNEL;
> - fep->reload_period = PPS_OUPUT_RELOAD_PERIOD;
> -
> spin_lock_irqsave(&fep->tmreg_lock, flags);
>
> + if (fep->pps_enable == enable) {
> + spin_unlock_irqrestore(&fep->tmreg_lock, flags);
> + return 0;
> + }
> +
> if (enable) {
> /* clear capture or output compare interrupt status if have.
> */
> @@ -532,6 +531,9 @@ static int fec_ptp_enable(struct ptp_clock_info *ptp,
> int ret = 0;
>
> if (rq->type == PTP_CLK_REQ_PPS) {
> + fep->pps_channel = DEFAULT_PPS_CHANNEL;
> + fep->reload_period = PPS_OUPUT_RELOAD_PERIOD;
> +

I think this does not address Eric's concern on V1, the initialization
still basically happens in the same scope.

On the flip side, quickly skimming over the ptp core code, it looks
like that the ptp core will always call this function under ptp-
>pincfg_mux mutex protection or at device unregistration time.

AFAICS that makes pps_channel and reload_period update safe, so overall
patch LGTM and I'll apply it soon.

Thanks,

Paolo


2024-05-23 09:40:49

by patchwork-bot+netdevbpf

[permalink] [raw]
Subject: Re: [PATCH v2 net] net: fec: avoid lock evasion when reading pps_enable

Hello:

This patch was applied to netdev/net.git (main)
by Paolo Abeni <[email protected]>:

On Tue, 21 May 2024 10:38:00 +0800 you wrote:
> The assignment of pps_enable is protected by tmreg_lock, but the read
> operation of pps_enable is not. So the Coverity tool reports a lock
> evasion warning which may cause data race to occur when running in a
> multithread environment. Although this issue is almost impossible to
> occur, we'd better fix it, at least it seems more logically reasonable,
> and it also prevents Coverity from continuing to issue warnings.
>
> [...]

Here is the summary with links:
- [v2,net] net: fec: avoid lock evasion when reading pps_enable
https://git.kernel.org/netdev/net/c/3b1c92f8e537

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html