From: Russell King When booting using root-nfs, I'm seeing (independently) two lockdep dumps in the smc91x driver. The patch below fixes both. Both dumps look like real locking issues. Nico - please review and ack if you think the patch is correct. Dump 1: Sending DHCP requests . ================================= [ INFO: inconsistent lock state ] --------------------------------- inconsistent {hardirq-on-W} -> {in-hardirq-W} usage. swapper/0 [HC1[1]:SC0[0]:HE0:SE1] takes: (&lp->lock){+-..}, at: [] smc_interrupt+0x24/0x740 {hardirq-on-W} state was registered at: [] lock_acquire+0x80/0x94 [] _spin_lock+0x30/0x40 [] smc_reset+0x2c/0x140 [] smc_drv_probe+0x288/0x720 [] platform_drv_probe+0x20/0x24 [] driver_probe_device+0x8c/0xd4 [] __driver_attach+0x88/0xe8 [] bus_for_each_dev+0x50/0x84 [] driver_attach+0x20/0x28 [] bus_add_driver+0x6c/0x138 [] driver_register+0x90/0xa0 [] platform_driver_register+0x6c/0x88 [] smc_init+0x14/0x1c [] init+0x140/0x318 [] do_exit+0x0/0x83c irq event stamp: 19510 hardirqs last enabled at (19509): [] default_idle+0x40/0x4c hardirqs last disabled at (19510): [] __irq_svc+0x28/0xc0 softirqs last enabled at (19504): [] __do_softirq+0xf4/0x10c softirqs last disabled at (19495): [] irq_exit+0x54/0x5c other info that might help us debug this: no locks held by swapper/0. stack backtrace: [] (dump_stack+0x0/0x14) from [] (print_usage_bug+0x19c/0x1f0) [] (print_usage_bug+0x0/0x1f0) from [] (mark_lock+0xf4/0x5b8) [] (mark_lock+0x0/0x5b8) from [] (__lock_acquire+0x50c/0xdd4) r8 = C021F520 r7 = C021F7DC r6 = 00000000 r5 = C02B11F4 r4 = 00000000 [] (__lock_acquire+0x0/0xdd4) from [] (lock_acquire+0x80/0x94) [] (lock_acquire+0x0/0x94) from [] (_spin_lock+0x30/0x40) [] (_spin_lock+0x0/0x40) from [] (smc_interrupt+0x24/0x740) r4 = C06EFB20 [] (smc_interrupt+0x0/0x740) from [] (handle_IRQ_event+0x34/0x6c) [] (handle_IRQ_event+0x0/0x6c) from [] (handle_level_irq+0xe8/0x158) r8 = C021BF48 r7 = C021D124 r6 = C06EFB20 r5 = 00000029 r4 = C021D100 [] (handle_level_irq+0x0/0x158) from [] (asm_do_IRQ+0x54/0x64) r8 = C001A680 r7 = 00008000 r6 = 00000029 r5 = F1100100 r4 = C021D100 [] (asm_do_IRQ+0x0/0x64) from [] (__irq_svc+0x28/0xc0) r4 = FFFFFFFF [] (default_idle+0x0/0x4c) from [] (cpu_idle+0x68/0x88) r4 = C0021A64 [] (cpu_idle+0x0/0x88) from [] (__init_end+0x28/0x30) r5 = C0274DB4 r4 = C03AC520 [] (__init_end+0x0/0x30) from [] (start_kernel+0x270/0x2dc) [] (start_kernel+0x0/0x2dc) from [<00008078>] (0x8078) r8 = 0001A078 r7 = C03C0328 r6 = C0220984 r5 = C0275240 r4 = 00C5387D eth0: link up, 100Mbps, full-duplex, lpa 0x45E1 Dump 2: Sending DHCP requests . ================================= [ INFO: inconsistent lock state ] --------------------------------- inconsistent {hardirq-on-W} -> {in-hardirq-W} usage. swapper/0 [HC1[1]:SC0[0]:HE0:SE1] takes: (&lp->lock){+-..}, at: [] smc_interrupt+0x24/0x740 {hardirq-on-W} state was registered at: [] lock_acquire+0x80/0x94 [] _spin_lock+0x30/0x40 [] smc_shutdown+0x20/0x74 [] smc_drv_probe+0x488/0x720 [] platform_drv_probe+0x20/0x24 [] driver_probe_device+0x8c/0xd4 [] __driver_attach+0x88/0xe8 [] bus_for_each_dev+0x50/0x84 [] driver_attach+0x20/0x28 [] bus_add_driver+0x6c/0x138 [] driver_register+0x90/0xa0 [] platform_driver_register+0x6c/0x88 [] smc_init+0x14/0x1c [] init+0x140/0x318 [] do_exit+0x0/0x83c irq event stamp: 19304 hardirqs last enabled at (19303): [] default_idle+0x40/0x4c hardirqs last disabled at (19304): [] __irq_svc+0x28/0xc0 softirqs last enabled at (19298): [] __do_softirq+0xf4/0x10c softirqs last disabled at (19289): [] irq_exit+0x54/0x5c other info that might help us debug this: no locks held by swapper/0. stack backtrace: [] (dump_stack+0x0/0x14) from [] (print_usage_bug+0x19c/0x1f0) [] (print_usage_bug+0x0/0x1f0) from [] (mark_lock+0xf4/0x5b8) [] (mark_lock+0x0/0x5b8) from [] (__lock_acquire+0x50c/0xdd4) r8 = C021F520 r7 = C021F7DC r6 = 00000000 r5 = C02B11F4 r4 = 00000000 [] (__lock_acquire+0x0/0xdd4) from [] (lock_acquire+0x80/0x94) [] (lock_acquire+0x0/0x94) from [] (_spin_lock+0x30/0x40) [] (_spin_lock+0x0/0x40) from [] (smc_interrupt+0x24/0x740) r4 = C06EFB20 [] (smc_interrupt+0x0/0x740) from [] (handle_IRQ_event+0x34/0x6c) [] (handle_IRQ_event+0x0/0x6c) from [] (handle_level_irq+0xe8/0x158) r8 = C021BF48 r7 = C021D124 r6 = C06EFB20 r5 = 00000029 r4 = C021D100 [] (handle_level_irq+0x0/0x158) from [] (asm_do_IRQ+0x54/0x64) r8 = C001A680 r7 = 00008000 r6 = 00000029 r5 = F1100100 r4 = C021D100 [] (asm_do_IRQ+0x0/0x64) from [] (__irq_svc+0x28/0xc0) r4 = FFFFFFFF [] (default_idle+0x0/0x4c) from [] (cpu_idle+0x68/0x88) r4 = C0021A64 [] (cpu_idle+0x0/0x88) from [] (__init_end+0x28/0x30) r5 = C0274DB4 r4 = C03AC520 [] (__init_end+0x0/0x30) from [] (start_kernel+0x270/0x2dc) [] (start_kernel+0x0/0x2dc) from [<00008078>] (0x8078) r8 = 0001A078 r7 = C03C0328 r6 = C0220984 r5 = C0275240 r4 = 00C5387D Signed-off-by: Russell King Cc: Nicolas Pitre Cc: Jeff Garzik Signed-off-by: Andrew Morton --- drivers/net/smc91x.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff -puN drivers/net/smc91x.c~lockdep-fix-smc91x drivers/net/smc91x.c --- a/drivers/net/smc91x.c~lockdep-fix-smc91x +++ a/drivers/net/smc91x.c @@ -321,12 +321,12 @@ static void smc_reset(struct net_device DBG(2, "%s: %s\n", dev->name, __FUNCTION__); /* Disable all interrupts, block TX tasklet */ - spin_lock(&lp->lock); + spin_lock_irq(&lp->lock); SMC_SELECT_BANK(2); SMC_SET_INT_MASK(0); pending_skb = lp->pending_tx_skb; lp->pending_tx_skb = NULL; - spin_unlock(&lp->lock); + spin_unlock_irq(&lp->lock); /* free any pending tx skb */ if (pending_skb) { @@ -448,12 +448,12 @@ static void smc_shutdown(struct net_devi DBG(2, "%s: %s\n", CARDNAME, __FUNCTION__); /* no more interrupts for me */ - spin_lock(&lp->lock); + spin_lock_irq(&lp->lock); SMC_SELECT_BANK(2); SMC_SET_INT_MASK(0); pending_skb = lp->pending_tx_skb; lp->pending_tx_skb = NULL; - spin_unlock(&lp->lock); + spin_unlock_irq(&lp->lock); if (pending_skb) dev_kfree_skb(pending_skb); _