net: fec: avoid lock evasion when reading pps_enable
authorWei Fang <wei.fang@nxp.com>
Tue, 21 May 2024 02:38:00 +0000 (10:38 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 23 May 2024 09:15:54 +0000 (11:15 +0200)
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@nxp.com>
Link: https://lore.kernel.org/r/20240521023800.17102-1-wei.fang@nxp.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/freescale/fec_ptp.c

index 181d9bfbee220f1a5ca0212ce467482e5417ccf8..e32f6724f5681627dde69b6502583f8aeb02ca3a 100644 (file)
@@ -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;