linux/net/sched
Patrick McHardy 0621ed2e4e [NET_SCHED]: Revert "avoid transmit softirq on watchdog wakeup" optimization
As noticed by Ranko Zivojnovic <ranko@spidernet.net>, calling qdisc_run
from the timer handler can result in 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!

The entire optimization is a bit questionable IMO, it moves potentially
large parts of NET_TX_SOFTIRQ work to TIMER_SOFTIRQ/HRTIMER_SOFTIRQ,
which kind of defeats the separation of them.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Acked-by: Ranko Zivojnovic <ranko@spidernet.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
2007-07-14 20:49:26 -07:00
..
act_api.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
act_gact.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
act_ipt.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
act_mirred.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
act_pedit.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
act_police.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
act_simple.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
cls_api.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
cls_basic.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
cls_fw.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
cls_route.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
cls_rsvp6.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
cls_rsvp.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
cls_rsvp.h [NETLINK]: Use nlmsg_trim() where appropriate 2007-04-25 22:26:37 -07:00
cls_tcindex.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
cls_u32.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
em_cmp.c [NET_SCHED]: ematch: module autoloading 2007-07-11 19:46:26 -07:00
em_meta.c [NET_SCHED]: ematch: module autoloading 2007-07-11 19:46:26 -07:00
em_nbyte.c [NET_SCHED]: ematch: module autoloading 2007-07-11 19:46:26 -07:00
em_text.c [NET_SCHED]: ematch: module autoloading 2007-07-11 19:46:26 -07:00
em_u32.c [NET_SCHED]: ematch: module autoloading 2007-07-11 19:46:26 -07:00
ematch.c [NET_SCHED]: ematch: module autoloading 2007-07-11 19:46:26 -07:00
Kconfig [NET_SCHED]: Remove CONFIG_NET_ESTIMATOR option 2007-07-10 22:16:37 -07:00
Makefile [NET]: Remove dead net/sched/Makefile entry for sch_hpfq.o. 2007-03-26 16:20:34 -07:00
sch_api.c [NET_SCHED]: Revert "avoid transmit softirq on watchdog wakeup" optimization 2007-07-14 20:49:26 -07:00
sch_atm.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_blackhole.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_cbq.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_dsmark.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_fifo.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_generic.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_gred.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_hfsc.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_htb.c [NET_SCHED]: Make HTB scheduler work with TSO. 2007-07-10 22:43:16 -07:00
sch_ingress.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_netem.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_prio.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_red.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_sfq.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_tbf.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
sch_teql.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00