Message ID | f044ed8ace1cb468c9a97c45fb03b749a4c2c17d.1553188500.git.pabeni@redhat.com |
---|---|
State | Changes Requested |
Delegated to: | David Miller |
Headers | show |
Series | net: dev: BYPASS for lockless qdisc | expand |
On 03/22/2019 01:30 AM, Paolo Abeni wrote: > With commit c5ad119fb6c0 ("net: sched: pfifo_fast use skb_array") > pfifo_fast no longer benefit from the TCQ_F_CAN_BYPASS optimization. > Due to retpolines the cost of the enqueue()/dequeue() pair has become > relevant and we observe measurable regression for the uncontended > scenario when the packet-rate is below line rate. Reviewed-by: Eric Dumazet <edumazet@google.com>
diff --git a/net/core/dev.c b/net/core/dev.c index 2b67f2aa59dd..e6cf39a9d3c5 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3468,6 +3468,15 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, if (unlikely(test_bit(__QDISC_STATE_DEACTIVATED, &q->state))) { __qdisc_drop(skb, &to_free); rc = NET_XMIT_DROP; + } else if ((q->flags & TCQ_F_CAN_BYPASS) && q->empty && + qdisc_run_begin(q)) { + qdisc_bstats_cpu_update(q, skb); + + if (sch_direct_xmit(skb, q, dev, txq, NULL, true)) + __qdisc_run(q); + + qdisc_run_end(q); + rc = NET_XMIT_SUCCESS; } else { rc = q->enqueue(skb, q, &to_free) & NET_XMIT_MASK; qdisc_run(q);