dev_kfree_skb() can end up calling local_bh_enable() which goes BUG if local interrupts are disabled. Apparently it can deadlock. So move the skb freeing outside the lock in the dmfe driver. It will decrease the lock hold time as well. drivers/net/tulip/dmfe.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff -puN drivers/net/tulip/dmfe.c~dmfe-kfree_skb-fix drivers/net/tulip/dmfe.c --- 25/drivers/net/tulip/dmfe.c~dmfe-kfree_skb-fix 2003-04-04 18:11:25.000000000 -0800 +++ 25-akpm/drivers/net/tulip/dmfe.c 2003-04-04 18:11:25.000000000 -0800 @@ -668,13 +668,13 @@ static int dmfe_start_xmit(struct sk_buf if ( db->tx_queue_cnt < TX_FREE_DESC_CNT ) netif_wake_queue(dev); - /* free this SKB */ - dev_kfree_skb(skb); - /* Restore CR7 to enable interrupt */ spin_unlock_irqrestore(&db->lock, flags); outl(db->cr7_data, dev->base_addr + DCR7); + /* free this SKB */ + dev_kfree_skb(skb); + return 0; } _