diff options
author | Eric Dumazet <edumazet@google.com> | 2014-10-03 22:31:07 (GMT) |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-10-03 22:36:11 (GMT) |
commit | 55a93b3ea780908b7d1b3a8cf1976223a9268d78 (patch) | |
tree | 2c33ad6aaf7a604185bff5659d64895f5cf9a348 /include/net | |
parent | 6a05880a8b22c6ba2ffdabbceb4635d28abe9072 (diff) | |
download | linux-55a93b3ea780908b7d1b3a8cf1976223a9268d78.tar.xz |
qdisc: validate skb without holding lock
Validation of skb can be pretty expensive :
GSO segmentation and/or checksum computations.
We can do this without holding qdisc lock, so that other cpus
can queue additional packets.
Trick is that requeued packets were already validated, so we carry
a boolean so that sch_direct_xmit() can validate a fresh skb list,
or directly use an old one.
Tested on 40Gb NIC (8 TX queues) and 200 concurrent flows, 48 threads
host.
Turning TSO on or off had no effect on throughput, only few more cpu
cycles. Lock contention on qdisc lock disappeared.
Same if disabling TX checksum offload.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
-rw-r--r-- | include/net/pkt_sched.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index 8bbe626..e4b3c82 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h @@ -99,7 +99,7 @@ void qdisc_put_stab(struct qdisc_size_table *tab); void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc); int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, struct net_device *dev, struct netdev_queue *txq, - spinlock_t *root_lock); + spinlock_t *root_lock, bool validate); void __qdisc_run(struct Qdisc *q); |