linux/net/sched
Herbert Xu d4828d85d1 [NET]: Prevent transmission after dev_deactivate
The dev_deactivate function has bit-rotted since the introduction of
lockless drivers.  In particular, the spin_unlock_wait call at the end
has no effect on the xmit routine of lockless drivers.

With a little bit of work, we can make it much more useful by providing
the guarantee that when it returns, no more calls to the xmit routine
of the underlying driver will be made.

The idea is simple.  There are two entry points in to the xmit routine.
The first comes from dev_queue_xmit.  That one is easily stopped by
using synchronize_rcu.  This works because we set the qdisc to noop_qdisc
before the synchronize_rcu call.  That in turn causes all subsequent
packets sent to dev_queue_xmit to be dropped.  The synchronize_rcu call
also ensures all outstanding calls leave their critical section.

The other entry point is from qdisc_run.  Since we now have a bit that
indicates whether it's running, all we have to do is to wait until the
bit is off.

I've removed the loop to wait for __LINK_STATE_SCHED to clear.  This is
useless because netif_wake_queue can cause it to be set again.  It is
also harmless because we've disarmed qdisc_run.

I've also removed the spin_unlock_wait on xmit_lock because its only
purpose of making sure that all outstanding xmit_lock holders have
exited is also given by dev_watchdog_down.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
2006-06-23 02:07:26 -07:00
..
Kconfig [PKT_SCHED]: Let NET_CLS_ACT no longer depend on EXPERIMENTAL 2006-03-20 22:44:24 -08:00
Makefile [PKT_SCHED]: Prefix tc actions with act_ 2006-01-09 14:16:14 -08:00
act_api.c [NET_SCHED]: act_api: fix skb leak in error path 2006-03-12 20:39:36 -08:00
act_gact.c [PKT_SCHED]: Prefix tc actions with act_ 2006-01-09 14:16:14 -08:00
act_ipt.c [NETFILTER]: ipt action: use xt_check_target for basic verification 2006-04-24 17:27:34 -07:00
act_mirred.c [PKT_SCHED]: Prefix tc actions with act_ 2006-01-09 14:16:14 -08:00
act_pedit.c [PKT_SCHED]: Prefix tc actions with act_ 2006-01-09 14:16:14 -08:00
act_police.c [PKT_SCHED] act_police: Rename methods. 2006-04-09 22:25:46 -07:00
act_simple.c [PKT_SCHED]: Prefix tc actions with act_ 2006-01-09 14:16:14 -08:00
cls_api.c [NETLINK]: Convert netlink users to use group numbers instead of bitmasks 2005-08-29 16:00:54 -07:00
cls_basic.c [PKT_SCHED]: Dump classification result for basic classifier 2005-06-08 15:11:02 -07:00
cls_fw.c [NET]: kfree cleanup 2005-11-08 09:41:34 -08:00
cls_route.c [NET]: kfree cleanup 2005-11-08 09:41:34 -08:00
cls_rsvp.c Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
cls_rsvp.h [NET]: kfree cleanup 2005-11-08 09:41:34 -08:00
cls_rsvp6.c Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
cls_tcindex.c [NET]: kfree cleanup 2005-11-08 09:41:34 -08:00
cls_u32.c [NET_SCHED]: cls_u32: remove unnecessary NULL-ptr check 2006-03-23 01:16:48 -08:00
em_cmp.c Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
em_meta.c [NET]: kfree cleanup 2005-11-08 09:41:34 -08:00
em_nbyte.c Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
em_text.c [PKT_SCHED]: Remove debugging leftover from textsearch ematch 2005-07-18 13:29:49 -07:00
em_u32.c Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
ematch.c [PKT_SCHED] ematch: Remove bogus include. 2006-01-11 16:32:16 -08:00
estimator.c Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
sch_api.c [PATCH] timer initialization cleanup: DEFINE_TIMER 2005-09-09 14:03:48 -07:00
sch_atm.c [PKT_SCHED]: Dump child qdisc handle in sch_{atm,dsmark} 2006-03-20 19:01:06 -08:00
sch_blackhole.c [PKT_SCHED]: Blackhole queueing discipline 2005-07-05 15:29:16 -07:00
sch_cbq.c [PKT_SCHED]: Fix qdisc return code. 2006-01-09 14:16:26 -08:00
sch_dsmark.c [PKT_SCHED]: Dump child qdisc handle in sch_{atm,dsmark} 2006-03-20 19:01:06 -08:00
sch_fifo.c [PKT_SCHED]: Cleanup fifo qdisc and remove unnecessary code 2005-06-18 22:58:00 -07:00
sch_generic.c [NET]: Prevent transmission after dev_deactivate 2006-06-23 02:07:26 -07:00
sch_gred.c [PKT_SCHED]: (G)RED: Introduce hard dropping 2005-11-05 22:02:29 +01:00
sch_hfsc.c [NET_SCHED]: HFSC: fix thinko in hfsc_adjust_levels() 2006-05-11 12:22:03 -07:00
sch_htb.c [PKT_SCHED]: Fix qdisc return code. 2006-01-09 14:16:26 -08:00
sch_ingress.c Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
sch_netem.c [PKT_SCHED] netem: fix loss 2006-04-29 18:33:12 -07:00
sch_prio.c [PKT_SCHED]: Qdisc drop operation is optional 2006-03-20 19:00:49 -08:00
sch_red.c [PKT_SCHED]: Convert sch_red to a classful qdisc 2006-03-20 19:20:44 -08:00
sch_sfq.c [PKT_SCHED]: Keep backlog counter in sch_sfq 2006-03-20 19:01:38 -08:00
sch_tbf.c [PKT_SCHED]: Restore TBF change semantic 2006-03-20 19:01:21 -08:00
sch_teql.c [NET]: Add netif_tx_lock 2006-06-17 21:30:14 -07:00