diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-10-15 15:22:34 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-10-21 06:09:40 -0400 |
commit | 7b5edbc4cfe2297b0915adea5aa1eafcafadbf06 (patch) | |
tree | e73820ca3521eb59d9e85bc6a420213bd1df0d3b /net/sched/sch_generic.c | |
parent | d827d86b6fe87b420ef3c0685ab580290ae64beb (diff) |
net/sched: fix missing spinlock init
Under network load, doing :
tc qdisc del dev eth0 root
triggers :
[ 167.193087] BUG: spinlock bad magic on CPU#3, udpflood/4928
[ 167.193139] lock: c15bc324, .magic: 00000000, .owner:
<none>/-1, .owner_cpu: -1
[ 167.193193] Pid: 4928, comm: udpflood Not tainted
2.6.36-rc7-11417-g215340c-dirty #323
[ 167.193245] Call Trace:
[ 167.193292] [<c13abaa0>] ? printk+0x18/0x20
[ 167.193342] [<c11afb53>] spin_bug+0xa3/0xf0
[ 167.193389] [<c11afcdd>] do_raw_spin_lock+0x7d/0x160
[ 167.193440] [<c1313d4e>] ? __dev_xmit_skb+0x27e/0x2b0
[ 167.193496] [<c107382b>] ? trace_hardirqs_on+0xb/0x10
[ 167.193545] [<c13ae99a>] _raw_spin_lock+0x3a/0x40
[ 167.193593] [<c1313d4e>] ? __dev_xmit_skb+0x27e/0x2b0
[ 167.193641] [<c1313d4e>] __dev_xmit_skb+0x27e/0x2b0
commit 79640a4ca695 (add additional lock to qdisc to increase
throughput) forgot to initialize noop_qdisc and noqueue_qdisc busylock
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_generic.c')
-rw-r--r-- | net/sched/sch_generic.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 3d57681bdb76..0abcc492fbf9 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
@@ -383,6 +383,7 @@ struct Qdisc noop_qdisc = { | |||
383 | .list = LIST_HEAD_INIT(noop_qdisc.list), | 383 | .list = LIST_HEAD_INIT(noop_qdisc.list), |
384 | .q.lock = __SPIN_LOCK_UNLOCKED(noop_qdisc.q.lock), | 384 | .q.lock = __SPIN_LOCK_UNLOCKED(noop_qdisc.q.lock), |
385 | .dev_queue = &noop_netdev_queue, | 385 | .dev_queue = &noop_netdev_queue, |
386 | .busylock = __SPIN_LOCK_UNLOCKED(noop_qdisc.busylock), | ||
386 | }; | 387 | }; |
387 | EXPORT_SYMBOL(noop_qdisc); | 388 | EXPORT_SYMBOL(noop_qdisc); |
388 | 389 | ||
@@ -409,6 +410,7 @@ static struct Qdisc noqueue_qdisc = { | |||
409 | .list = LIST_HEAD_INIT(noqueue_qdisc.list), | 410 | .list = LIST_HEAD_INIT(noqueue_qdisc.list), |
410 | .q.lock = __SPIN_LOCK_UNLOCKED(noqueue_qdisc.q.lock), | 411 | .q.lock = __SPIN_LOCK_UNLOCKED(noqueue_qdisc.q.lock), |
411 | .dev_queue = &noqueue_netdev_queue, | 412 | .dev_queue = &noqueue_netdev_queue, |
413 | .busylock = __SPIN_LOCK_UNLOCKED(noqueue_qdisc.busylock), | ||
412 | }; | 414 | }; |
413 | 415 | ||
414 | 416 | ||