netdev
[Top] [All Lists]

[PATCH 2.6.9-rc3-mm2 4/5] r8169: rtl8169_close() races

To: jgarzik@xxxxxxxxx
Subject: [PATCH 2.6.9-rc3-mm2 4/5] r8169: rtl8169_close() races
From: Francois Romieu <romieu@xxxxxxxxxxxxx>
Date: Mon, 4 Oct 2004 21:52:16 +0200
Cc: netdev@xxxxxxxxxxx, akpm@xxxxxxxx
In-reply-to: <20041004195051.GB20379@xxxxxxxxxxxxxxxxxxxxxxxxxx>
References: <20041004194826.GA18404@xxxxxxxxxxxxxxxxxxxxxxxxxx> <20041004194949.GA20379@xxxxxxxxxxxxxxxxxxxxxxxxxx> <20041004195051.GB20379@xxxxxxxxxxxxxxxxxxxxxxxxxx>
Sender: netdev-bounce@xxxxxxxxxxx
User-agent: Mutt/1.4.1i
- close the race with rtl8169_interrupt() which appears when rtl8169_close()
  uses synchronize_irq()/free_irq();
- netif_poll_disable() allows rtl8169_close() to wait for any pending
  rtl8169_poll() to complete so it can safely clear the rings.

Signed-off-by: Francois Romieu <romieu@xxxxxxxxxxxxx>

diff -puN drivers/net/r8169.c~r8169-215 drivers/net/r8169.c
--- linux-2.6.9-rc3/drivers/net/r8169.c~r8169-215       2004-10-04 
21:26:01.000000000 +0200
+++ linux-2.6.9-rc3-fr/drivers/net/r8169.c      2004-10-04 21:26:01.000000000 
+0200
@@ -2142,6 +2142,9 @@ rtl8169_interrupt(int irq, void *dev_ins
        int status = 0;
        int handled = 0;
 
+       if (unlikely(!netif_running(dev)))
+               goto out;
+
        do {
                status = RTL_R16(IntrStatus);
 
@@ -2196,6 +2199,7 @@ rtl8169_interrupt(int irq, void *dev_ins
                /* Clear all interrupt sources. */
                RTL_W16(IntrStatus, 0xffff);
        }
+out:
        return IRQ_RETVAL(handled);
 }
 
@@ -2259,6 +2263,8 @@ rtl8169_close(struct net_device *dev)
        synchronize_irq(dev->irq);
        free_irq(dev->irq, dev);
 
+       netif_poll_disable(dev);
+
        rtl8169_tx_clear(tp);
 
        rtl8169_rx_clear(tp);

_

<Prev in Thread] Current Thread [Next in Thread>