From: Larry Finger Date: Thu, 2 Apr 2009 08:09:43 +0000 (-0700) Subject: kaweth: Fix locking to be SMP-safe X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=4ff61c8f7b5e1e60620a04a64ac0715c0822fdac;p=linux-2.6-omap-h63xx.git kaweth: Fix locking to be SMP-safe On an SMP system, the following message is printed. The patch below gets fixes the problem. ================================= [ INFO: inconsistent lock state ] 2.6.29-Linus-05093-gc31f403 #57 --------------------------------- inconsistent {hardirq-on-W} -> {in-hardirq-W} usage. bash/4105 [HC1[1]:SC0[0]:HE0:SE1] takes: (&kaweth->device_lock){+...}, at: [] kaweth_usb_receive+0x77/0x1af [kaw eth] {hardirq-on-W} state was registered at: [] __lock_acquire+0x753/0x1685 [] lock_acquire+0x55/0x71 [] _spin_lock+0x31/0x3d [] kaweth_start_xmit+0x2b/0x1e1 [kaweth] [] dev_hard_start_xmit+0x22e/0x2ad [] __qdisc_run+0xf2/0x203 [] dev_queue_xmit+0x263/0x39b [] packet_sendmsg_spkt+0x1c4/0x20a [af_packet] [] sock_sendmsg+0xe4/0xfd [] sys_sendto+0xe4/0x10c [] system_call_fastpath+0x16/0x1b [] 0xffffffffffffffff irq event stamp: 1280 hardirqs last enabled at (1279): [] _spin_unlock_irqrestore+0x44/0x4c hardirqs last disabled at (1280): [] save_args+0x67/0x70 softirqs last enabled at (660): [] __do_softirq+0x14d/0x15d softirqs last disabled at (651): [] call_softirq+0x1c/0x28 Signed-off-by: Larry Finger Signed-off-by: David S. Miller --- diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c index 7cb10a0a531..3d0d0b0b37c 100644 --- a/drivers/net/usb/kaweth.c +++ b/drivers/net/usb/kaweth.c @@ -36,7 +36,6 @@ * Run test procedures * Fix bugs from previous two steps * Snoop other OSs for any tricks we're not doing - * SMP locking * Reduce arbitrary timeouts * Smart multicast support * Temporary MAC change support @@ -796,7 +795,7 @@ static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net) int res; - spin_lock(&kaweth->device_lock); + spin_lock_irq(&kaweth->device_lock); kaweth_async_set_rx_mode(kaweth); netif_stop_queue(net); @@ -814,7 +813,7 @@ static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net) if (!copied_skb) { kaweth->stats.tx_errors++; netif_start_queue(net); - spin_unlock(&kaweth->device_lock); + spin_unlock_irq(&kaweth->device_lock); return 0; } } @@ -848,7 +847,7 @@ skip: net->trans_start = jiffies; } - spin_unlock(&kaweth->device_lock); + spin_unlock_irq(&kaweth->device_lock); return 0; }