diff options
author | Francois Romieu <romieu@fr.zoreil.com> | 2007-08-15 00:29:27 +0200 |
---|---|---|
committer | Willy Tarreau <w@1wt.eu> | 2007-10-17 21:30:22 +0200 |
commit | c28be534be0e40ef085ee707d9af390bfa6d7858 (patch) | |
tree | 1475a085976dd299f9cdb1263dd6f98226512773 | |
parent | e54a4b21a342c6a80c2e1bed14f1d31c24fadf45 (diff) | |
download | lwn-c28be534be0e40ef085ee707d9af390bfa6d7858.tar.gz lwn-c28be534be0e40ef085ee707d9af390bfa6d7858.zip |
[PATCH] r8169: avoid needless NAPI poll scheduling
Theory : though needless, it should not have hurt.
Practice: it does not play nice with DEBUG_SHIRQ + LOCKDEP + UP
(see https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=3D242572).
The patch makes sense in itself but I should dig why it has an effect
on #242572 (assuming that NAPI do not change in a near future).
Patch in mainline as 313b0305b5a1e7e0fb39383befbf79558ce68a9c.
Backported to 2.6.22-stable by Thomas M=FCller.
Signed-off-by: Thomas M=FCller <thomas@mathtm.de>
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/net/r8169.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 1aafa714b410..2847a0ca7aac 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c @@ -2646,14 +2646,16 @@ rtl8169_interrupt(int irq, void *dev_instance) rtl8169_check_link_status(dev, tp, ioaddr); #ifdef CONFIG_R8169_NAPI - RTL_W16(IntrMask, rtl8169_intr_mask & ~rtl8169_napi_event); - tp->intr_mask = ~rtl8169_napi_event; - - if (likely(netif_rx_schedule_prep(dev))) - __netif_rx_schedule(dev); - else if (netif_msg_intr(tp)) { - printk(KERN_INFO "%s: interrupt %04x taken in poll\n", - dev->name, status); + if (status & rtl8169_napi_event) { + RTL_W16(IntrMask, rtl8169_intr_mask & ~rtl8169_napi_event); + tp->intr_mask = ~rtl8169_napi_event; + + if (likely(netif_rx_schedule_prep(dev))) + __netif_rx_schedule(dev); + else if (netif_msg_intr(tp)) { + printk(KERN_INFO "%s: interrupt %04x in poll\n", + dev->name, status); + } } break; #else |