realtek: Fix Ethernet driver IRQ service routine for SMP
authorBirger Koblitz <git@birger-koblitz.de>
Sat, 1 Jan 2022 13:22:41 +0000 (14:22 +0100)
committerDaniel Golle <daniel@makrotopia.org>
Thu, 17 Feb 2022 15:21:47 +0000 (15:21 +0000)
Do not lock the register structure in IRQ context. It is not
necessary and leads to lockups under SMP load.

Signed-off-by: Birger Koblitz <git@birger-koblitz.de>
target/linux/realtek/files-5.10/drivers/net/ethernet/rtl838x_eth.c

index 9e5dfe9640e1ee5fe63d04eb66cafa81b0618534..39d28ae896e41c811dbd02ce98b51c00da8dcb77 100644 (file)
@@ -331,7 +331,6 @@ bool rtl931x_decode_tag(struct p_hdr *h, struct dsa_tag *t)
 /*
  * Discard the RX ring-buffers, called as part of the net-ISR
  * when the buffer runs over
- * Caller needs to hold priv->lock
  */
 static void rtl838x_rb_cleanup(struct rtl838x_eth_priv *priv, int status)
 {
@@ -439,7 +438,6 @@ static irqreturn_t rtl83xx_net_irq(int irq, void *dev_id)
 
        pr_debug("IRQ: %08x\n", status);
 
-       spin_lock(&priv->lock);
        /*  Ignore TX interrupt */
        if ((status & 0xf0000)) {
                /* Clear ISR */
@@ -482,7 +480,6 @@ static irqreturn_t rtl83xx_net_irq(int irq, void *dev_id)
                rtl839x_l2_notification_handler(priv);
        }
 
-       spin_unlock(&priv->lock);
        return IRQ_HANDLED;
 }
 
@@ -497,7 +494,6 @@ static irqreturn_t rtl93xx_net_irq(int irq, void *dev_id)
 
        pr_debug("In %s, status_tx: %08x, status_rx: %08x, status_rx_r: %08x\n",
                __func__, status_tx, status_rx, status_rx_r);
-       spin_lock(&priv->lock);
 
        /*  Ignore TX interrupt */
        if (status_tx) {
@@ -528,7 +524,6 @@ static irqreturn_t rtl93xx_net_irq(int irq, void *dev_id)
                rtl838x_rb_cleanup(priv, status_rx_r);
        }
 
-       spin_unlock(&priv->lock);
        return IRQ_HANDLED;
 }