]> git.hungrycats.org Git - linux/commitdiff
[netdrvr 8139cp] fix NAPI race
authorHirofumi Ogawa <hirofumi@mail.parknet.co.jp>
Sat, 24 Jan 2004 10:57:20 +0000 (05:57 -0500)
committerLinus Torvalds <torvalds@home.osdl.org>
Sat, 24 Jan 2004 10:57:20 +0000 (05:57 -0500)
Andreas Happe <andreashappe@gmx.net> writes:
> my notebook (hp/compaq nx7000) still crashes when using 8139cp (runs
> rock solid with 8139too driver). The computer just locks up, there is no
> dmesg output. This has happened since I've got this laptop (around
> november '03).

It seems 8139cp.c has the race condition of rx_poll and interrupt.

NOTE, since I don't have this device, patch is untested. Sorry.

drivers/net/8139cp.c

index bb57ed880f15ad79634c0bb1ba3e7adf82ad8e2f..9bfeed893229d8326a7ecbd51637df86944c1eb1 100644 (file)
@@ -615,8 +615,10 @@ rx_next:
                if (cpr16(IntrStatus) & cp_rx_intr_mask)
                        goto rx_status_loop;
 
-               netif_rx_complete(dev);
+               local_irq_disable();
                cpw16_f(IntrMask, cp_intr_mask);
+               __netif_rx_complete(dev);
+               local_irq_enable();
 
                return 0;       /* done */
        }
@@ -643,6 +645,12 @@ cp_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
 
        spin_lock(&cp->lock);
 
+       /* close possible race's with dev_close */
+       if (unlikely(!netif_running(dev))) {
+               cpw16(IntrMask, 0);
+               goto out;
+       }
+
        if (status & (RxOK | RxErr | RxEmpty | RxFIFOOvr)) {
                if (netif_rx_schedule_prep(dev)) {
                        cpw16_f(IntrMask, cp_norx_intr_mask);
@@ -664,7 +672,7 @@ cp_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
 
                /* TODO: reset hardware */
        }
-
+out:
        spin_unlock(&cp->lock);
        return IRQ_HANDLED;
 }