linux-stable/net/sched
Krishna Kumar bbd8a0d3a3 net: Avoid enqueuing skb for default qdiscs
dev_queue_xmit enqueue's a skb and calls qdisc_run which
dequeue's the skb and xmits it. In most cases, the skb that
is enqueue'd is the same one that is dequeue'd (unless the
queue gets stopped or multiple cpu's write to the same queue
and ends in a race with qdisc_run). For default qdiscs, we
can remove the redundant enqueue/dequeue and simply xmit the
skb since the default qdisc is work-conserving.

The patch uses a new flag - TCQ_F_CAN_BYPASS to identify the
default fast queue. The controversial part of the patch is
incrementing qlen when a skb is requeued - this is to avoid
checks like the second line below:

+  } else if ((q->flags & TCQ_F_CAN_BYPASS) && !qdisc_qlen(q) &&
>>         !q->gso_skb &&
+          !test_and_set_bit(__QDISC_STATE_RUNNING, &q->state)) {

Results of a 2 hour testing for multiple netperf sessions (1,
2, 4, 8, 12 sessions on a 4 cpu system-X). The BW numbers are
aggregate Mb/s across iterations tested with this version on
System-X boxes with Chelsio 10gbps cards:

----------------------------------
Size |  ORG BW          NEW BW   |
----------------------------------
128K |  156964          159381   |
256K |  158650          162042   |
----------------------------------

Changes from ver1:

1. Move sch_direct_xmit declaration from sch_generic.h to
   pkt_sched.h
2. Update qdisc basic statistics for direct xmit path.
3. Set qlen to zero in qdisc_reset.
4. Changed some function names to more meaningful ones.

Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2009-08-06 20:10:18 -07:00
..
Kconfig cls_cgroup: clean up Kconfig 2008-12-29 19:40:46 -08:00
Makefile pkt_sched: add DRR scheduler 2008-11-20 04:10:00 -08:00
act_api.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_gact.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_ipt.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_mirred.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_nat.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_pedit.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_police.c pkt_sched: Update drops stats in act_police 2009-06-17 18:56:45 -07:00
act_simple.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_skbedit.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
cls_api.c net_cls: fix unconfigured struct tcf_proto keeps chaining and avoid kernel panic when we use cls_cgroup 2009-06-02 02:17:34 -07:00
cls_basic.c pkt_sched: remove unnecessary xchg() in packet classifiers 2008-11-20 04:14:28 -08:00
cls_cgroup.c Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6 2009-06-15 03:02:23 -07:00
cls_flow.c net: skb->dst accessors 2009-06-03 02:51:04 -07:00
cls_fw.c pkt_sched: remove unnecessary xchg() in packet classifiers 2008-11-20 04:14:28 -08:00
cls_route.c net: skb->dst accessors 2009-06-03 02:51:04 -07:00
cls_rsvp.c
cls_rsvp.h [NET_SCHED]: Use nla_policy for attribute validation in classifiers 2008-01-28 15:11:23 -08:00
cls_rsvp6.c
cls_tcindex.c pkt_sched: remove unnecessary xchg() in packet classifiers 2008-11-20 04:14:28 -08:00
cls_u32.c pkt_sched: cls_u32: Fix locking in u32_change() 2009-01-05 18:14:19 -08:00
em_cmp.c net: em_cmp.c use unaligned access helpers 2008-09-22 19:20:51 -07:00
em_meta.c net: correct off-by-one write allocations reports 2009-06-18 00:29:12 -07:00
em_nbyte.c [NET_SCHED]: ematch: module autoloading 2007-07-11 19:46:26 -07:00
em_text.c [NET_SCHED]: Convert classifiers from rtnetlink to new netlink API 2008-01-28 15:11:11 -08:00
em_u32.c [PKT_SCHED]: annotate cls_u32 2008-03-17 22:46:46 -07:00
ematch.c ematch: simpler tcf_em_unregister() 2008-11-16 23:01:49 -08:00
sch_api.c pkt_sched: Rename PSCHED_US2NS and PSCHED_NS2US 2009-06-15 02:31:47 -07:00
sch_atm.c pkt_sched: remove unnecessary xchg() in packet schedulers 2008-11-20 04:11:36 -08:00
sch_blackhole.c pkt_sched: Add qdisc->ops->peek() implementation. 2008-10-31 00:45:55 -07:00
sch_cbq.c pkt_sched: Rename PSCHED_US2NS and PSCHED_NS2US 2009-06-15 02:31:47 -07:00
sch_drr.c pkt_sched: Change misleading code in class delete. 2009-03-15 20:00:19 -07:00
sch_dsmark.c pkt_sched: remove unnecessary xchg() in packet schedulers 2008-11-20 04:11:36 -08:00
sch_fifo.c net-sched: fix bfifo default limit 2009-05-06 16:45:07 -07:00
sch_generic.c net: Avoid enqueuing skb for default qdiscs 2009-08-06 20:10:18 -07:00
sch_gred.c pkt_sched: Remove qdisc->ops->requeue() etc. 2008-11-13 22:56:30 -08:00
sch_hfsc.c pkt_sched: Use PSCHED_SHIFT in PSCHED time conversion 2009-06-09 05:25:29 -07:00
sch_htb.c pkt_sched: Change misleading code in class delete. 2009-03-15 20:00:19 -07:00
sch_ingress.c net_sched: Add accessor function for packet length for qdiscs 2008-07-20 00:08:27 -07:00
sch_multiq.c pkt_sched: sch_multiq: Change errno on non-multiqueue devices use. 2009-02-10 00:11:21 -08:00
sch_netem.c net: sch_netem: Fix an inconsistency in ingress netem timestamps. 2009-04-20 02:14:59 -07:00
sch_prio.c pkt_sched: remove unnecessary xchg() in packet schedulers 2008-11-20 04:11:36 -08:00
sch_red.c pkt_sched: remove unnecessary xchg() in packet schedulers 2008-11-20 04:11:36 -08:00
sch_sfq.c net: skb->dst accessors 2009-06-03 02:51:04 -07:00
sch_tbf.c net/*: use linux/kernel.h swap() 2009-03-21 13:36:17 -07:00
sch_teql.c net: use NETDEV_TX_OK instead of 0 in ndo_start_xmit() functions 2009-07-05 19:16:04 -07:00