• K
    net: Avoid enqueuing skb for default qdiscs · bbd8a0d3
    Krishna Kumar 提交于
    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: NKrishna Kumar <krkumar2@in.ibm.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    bbd8a0d3
sch_generic.h 13.7 KB