From b57bd06655a028aba7b92e1c19c2093e7fcfb341 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Tue, 12 Dec 2006 13:49:35 +0100 Subject: [PATCH] [PATCH] net, 8139too.c: fix netpoll deadlock fix deadlock in the 8139too driver: poll handlers should never forcibly enable local interrupts, because they might be used by netpoll/printk from IRQ context. ================================= [ INFO: inconsistent lock state ] 2.6.19 #11 --------------------------------- inconsistent {softirq-on-W} -> {in-softirq-W} usage. swapper/1 [HC0[0]:SC1[1]:HE1:SE0] takes: (&npinfo->poll_lock){-+..}, at: [] net_rx_action+0x64/0x1de {softirq-on-W} state was registered at: [] mark_lock+0x5b/0x39c [] mark_held_locks+0x4b/0x68 [] trace_hardirqs_on+0x115/0x139 [] rtl8139_poll+0x3d7/0x3f4 [] netpoll_poll+0x82/0x32f [] netpoll_send_skb+0xc9/0x12f [] netpoll_send_udp+0x253/0x25b [] write_msg+0x40/0x65 [] __call_console_drivers+0x45/0x51 [] _call_console_drivers+0x5d/0x61 [] release_console_sem+0x11f/0x1d8 [] register_console+0x1ac/0x1b3 [] init_netconsole+0x55/0x67 [] init+0x9a/0x24e [] kernel_thread_helper+0x7/0x10 [] 0xffffffff irq event stamp: 819992 hardirqs last enabled at (819992): [] net_rx_action+0x39/0x1de hardirqs last disabled at (819991): [] net_rx_action+0x141/0x1de softirqs last enabled at (817552): [] __do_softirq+0xa3/0xa8 softirqs last disabled at (819987): [] do_softirq+0x5b/0xc9 other info that might help us debug this: no locks held by swapper/1. stack backtrace: [] dump_trace+0x63/0x1e8 [] show_trace_log_lvl+0x19/0x2e [] show_trace+0x12/0x14 [] dump_stack+0x14/0x16 [] print_usage_bug+0x23c/0x246 [] mark_lock+0x108/0x39c [] __lock_acquire+0x361/0x9ed [] lock_acquire+0x56/0x72 [] _spin_lock+0x35/0x42 [] net_rx_action+0x64/0x1de [] __do_softirq+0x52/0xa8 [] do_softirq+0x5b/0xc9 [] irq_exit+0x3c/0x48 [] do_IRQ+0xa4/0xbd [] common_interrupt+0x2e/0x34 [] vprintk+0x2c0/0x309 [] printk+0x1b/0x1d [] init+0x80/0x24e [] kernel_thread_helper+0x7/0x10 ======================= Signed-off-by: Ingo Molnar Acked-by: Jeff Garzik Signed-off-by: Linus Torvalds --- drivers/net/8139too.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c index 931028f672..35ad5cff18 100644 --- a/drivers/net/8139too.c +++ b/drivers/net/8139too.c @@ -2131,14 +2131,15 @@ static int rtl8139_poll(struct net_device *dev, int *budget) } if (done) { + unsigned long flags; /* * Order is important since data can get interrupted * again when we think we are done. */ - local_irq_disable(); + local_irq_save(flags); RTL_W16_F(IntrMask, rtl8139_intr_mask); __netif_rx_complete(dev); - local_irq_enable(); + local_irq_restore(flags); } spin_unlock(&tp->rx_lock); -- 2.39.5