It's not enough that forcedeth's interrupts are disabled,
local cpu interrupts have to unconditionally be off
when we remove the device from the poll list.
Based upon a crash report from
Alexander Beregalov <a.beregalov@gmail.com>:
WARNING: at lib/list_debug.c:30 __list_add+0x89/0x90()
Hardware name:
list_add corruption. prev->next should be next (
c06ea834), but was
f70244c8. (prev=
c06ea834).
Modules linked in: w83627hf hwmon_vid i2c_nforce2
Pid: 1436, comm: portageq Not tainted 2.6.30-rc1 #1
Call Trace:
[<
c0129d73>] warn_slowpath+0x73/0xd0
[<
c03c6008>] ? __kfree_skb+0x38/0x90
[<
c03f9b06>] ? tcp_data_snd_check+0x26/0xe0
[<
c03fd67f>] ? tcp_rcv_established+0x2bf/0x5e0
[<
c040557a>] ? tcp_v4_rcv+0x47a/0x610
[<
c014cebd>] ? print_lock_contention_bug+0x1d/0x110
[<
c044a967>] ? _spin_unlock+0x27/0x50
[<
c040564b>] ? tcp_v4_rcv+0x54b/0x610
[<
c02d86f9>] __list_add+0x89/0x90
[<
c03ccff9>] __napi_schedule+0x29/0x60
[<
c036946d>] e1000_intr+0xbd/0x1a0
[<
c015c5de>] handle_IRQ_event+0x3e/0x120
[<
c015e190>] handle_fasteoi_irq+0x60/0xd0
[<
c0104fd4>] handle_irq+0x34/0x60
[<
c015f748>] ? rcu_irq_enter+0x8/0x40
[<
c0104b29>] do_IRQ+0x39/0xa0
[<
c03c592c>] ? skb_release_head_state+0x2c/0x60
[<
c01034ee>] common_interrupt+0x2e/0x34
[<
c02d8601>] ? list_del+0x21/0x90
[<
c014e54b>] ? trace_hardirqs_on+0xb/0x10
[<
c03cd4da>] __napi_complete+0x1a/0x30
[<
c0381971>] nv_napi_poll+0xd1/0x5c0
[<
c014e54b>] ? trace_hardirqs_on+0xb/0x10
[<
c03cd5f6>] net_rx_action+0x106/0x1b0
[<
c012e8df>] __do_softirq+0x6f/0x100
[<
c044a967>] ? _spin_unlock+0x27/0x50
[<
c015e1b8>] ? handle_fasteoi_irq+0x88/0xd0
[<
c012e9cd>] do_softirq+0x5d/0x70
[<
c012ebad>] irq_exit+0x7d/0xa0
[<
c0104b32>] do_IRQ+0x42/0xa0
[<
c012e9b7>] ? do_softirq+0x47/0x70
[<
c01034ee>] common_interrupt+0x2e/0x34
Signed-off-by: David S. Miller <davem@davemloft.net>