Andrew Morton wrote:
quoted
http://bugzilla.kernel.org/show_bug.cgi?id=8736
Here is another scenario I bumped onto - qdisc_watchdog_cancel() and
qdisc_restart() deadlock.
CPU#0
qdisc_watchdog() fires and gets dev->queue_lock
qdisc_run()...qdisc_restart()...
-> releases dev->queue_lock and enters dev_hard_start_xmit()
CPU#1
tc del qdisc dev ...
qdisc_graft()...dev_graft_qdisc()...dev_deactivate()...
-> grabs dev->queue_lock ...
qdisc_reset()...{cbq,hfsc,htb,netem,tbf}_reset()...qdisc_watchdog_cancel()...
-> hrtimer_cancel() - waiting for the qdisc_watchdog() to exit, while still
holding dev->queue_lock
CPU#0
dev_hard_start_xmit() returns ...
-> wants to get dev->queue_lock(!)
DEADLOCK!
Good catch.
Please try reverting commit 1936502d00ae6c2aa3931c42f6cf54afaba094f2,
that should fix it.