net: phy: micrel: Move netif_rx() outside of IRQ-off section.
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Sun, 6 Mar 2022 21:57:53 +0000 (22:57 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Mar 2022 11:40:41 +0000 (11:40 +0000)
lan8814_match_rx_ts() invokes netif_rx() with disables interrupts
outside which will create a warning. Invoking netif_rx_ni() with
disabled interrupts is wrong even without the recent rework because
netif_rx_ni() would enable interrupts while processing the softirq. This
in turn can lead to dead lock if an interrupts triggers and attempts to
acquire kszphy_ptp_priv::rx_ts_lock.

Move netif_rx() outside the IRQ-off section.

Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Heiner Kallweit <hkallweit1@gmail.com>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Divya Koppera <Divya.Koppera@microchip.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/micrel.c

index d46b74e..19b11e8 100644 (file)
@@ -2034,8 +2034,6 @@ static bool lan8814_match_rx_ts(struct kszphy_ptp_priv *ptp_priv,
                memset(shhwtstamps, 0, sizeof(*shhwtstamps));
                shhwtstamps->hwtstamp = ktime_set(rx_ts->seconds,
                                                  rx_ts->nsec);
-               netif_rx(skb);
-
                list_del(&rx_ts->list);
                kfree(rx_ts);
 
@@ -2044,6 +2042,8 @@ static bool lan8814_match_rx_ts(struct kszphy_ptp_priv *ptp_priv,
        }
        spin_unlock_irqrestore(&ptp_priv->rx_ts_lock, flags);
 
+       if (ret)
+               netif_rx(skb);
        return ret;
 }