• Ingo Molnar's avatar
    forcedeth: fix locking bug with netconsole · bd6ca637
    Ingo Molnar authored
    While using netconsole on forcedeth, lockdep noticed the following locking
    bug:
    
    =================================
    [ INFO: inconsistent lock state ]
    2.6.24-rc6 #6
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    ---------------------------------
    inconsistent {softirq-on-W} -> {in-softirq-W} usage.
    udevd/719 [HC0[0]:SC1[1]:HE1:SE0] takes:
     (_xmit_ETHER){-+..}, at: [<c043062e>] dev_watchdog+0x1c/0xb9
    {softirq-on-W} state was registered at:
      [<c0147f67>] mark_held_locks+0x4e/0x66
      [<c014810e>] trace_hardirqs_on+0xfe/0x136
      [<c048ae63>] _spin_unlock_irq+0x22/0x42
      [<c02ec617>] nv_start_xmit_optimized+0x347/0x37a
      [<c042c80d>] netpoll_send_skb+0xa4/0x147
      [<c042d4a6>] netpoll_send_udp+0x238/0x242
      [<c02f44f6>] write_msg+0x6d/0x9b
      [<c012c129>] __call_console_drivers+0x4e/0x5a
      [<c012c18c>] _call_console_drivers+0x57/0x5b
      [<c012c2dd>] release_console_sem+0x11c/0x1b9
      [<c012caeb>] register_console+0x1eb/0x1f3
      [<c06ae673>] init_netconsole+0x119/0x15f
      [<c069149b>] kernel_init+0x147/0x294
      [<c01058cb>] kernel_thread_helper+0x7/0x10
      [<ffffffff>] 0xffffffff
    irq event stamp: 950
    hardirqs last  enabled at (950): [<c048ae63>] _spin_unlock_irq+0x22/0x42
    hardirqs last disabled at (949): [<c048aaf7>] _spin_lock_irq+0xc/0x38
    softirqs last  enabled at (0): [<c012a29c>] copy_process+0x375/0x126d
    softirqs last disabled at (947): [<c0106d43>] do_softirq+0x61/0xc6
    
    other info that might help us debug this:
    no locks held by udevd/719.
    
    stack backtrace:
    Pid: 719, comm: udevd Not tainted 2.6.24-rc6 #6
     [<c0105c46>] show_trace_log_lvl+0x12/0x25
     [<c01063ec>] show_trace+0xd/0x10
     [<c010670c>] dump_stack+0x57/0x5f
     [<c0147505>] print_usage_bug+0x10a/0x117
     [<c0147c38>] mark_lock+0x121/0x402
     [<c01488b6>] __lock_acquire+0x3d1/0xb64
     [<c0149405>] lock_acquire+0x4e/0x6a
     [<c048a99b>] _spin_lock+0x23/0x32
     [<c043062e>] dev_watchdog+0x1c/0xb9
     [<c0133e4a>] run_timer_softirq+0x133/0x193
     [<c0130907>] __do_softirq+0x78/0xed
     [<c0106d43>] do_softirq+0x61/0xc6
     =======================
    eth1: link down
    
    The fix is to disable/restore irqs instead of disable/enable.
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    Cc: Ayaz Abdulla <aabdulla@nvidia.com>
    Cc: Jeff Garzik <jeff@garzik.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
    bd6ca637
forcedeth.c 177 KB