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

From: Paolo Abeni
Date: Thu May 23 2024 - 05:15:12 EST


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 <wei.fang@xxxxxxx>
> ---
> 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