Files
linux/net/ipv4
Eric Dumazet 2b85a34e91 net: No more expensive sock_hold()/sock_put() on each tx
One of the problem with sock memory accounting is it uses
a pair of sock_hold()/sock_put() for each transmitted packet.

This slows down bidirectional flows because the receive path
also needs to take a refcount on socket and might use a different
cpu than transmit path or transmit completion path. So these
two atomic operations also trigger cache line bounces.

We can see this in tx or tx/rx workloads (media gateways for example),
where sock_wfree() can be in top five functions in profiles.

We use this sock_hold()/sock_put() so that sock freeing
is delayed until all tx packets are completed.

As we also update sk_wmem_alloc, we could offset sk_wmem_alloc
by one unit at init time, until sk_free() is called.
Once sk_free() is called, we atomic_dec_and_test(sk_wmem_alloc)
to decrement initial offset and atomicaly check if any packets
are in flight.

skb_set_owner_w() doesnt call sock_hold() anymore

sock_wfree() doesnt call sock_put() anymore, but check if sk_wmem_alloc
reached 0 to perform the final freeing.

Drawback is that a skb->truesize error could lead to unfreeable sockets, or
even worse, prematurely calling __sk_free() on a live socket.

Nice speedups on SMP. tbench for example, going from 2691 MB/s to 2711 MB/s
on my 8 cpu dev machine, even if tbench was not really hitting sk_refcnt
contention point. 5 % speedup on a UDP transmit workload (depends
on number of flows), lowering TX completion cpu usage.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2009-06-11 02:55:43 -07:00
..
2008-11-25 17:59:27 -08:00
2009-06-03 02:51:04 -07:00
2008-07-16 20:20:11 -07:00
2009-05-18 22:15:58 -07:00
2008-11-25 17:59:27 -08:00
2009-06-03 02:51:04 -07:00
2009-06-03 02:51:04 -07:00
2009-04-28 08:03:26 -07:00
2009-06-03 02:51:04 -07:00
2009-06-03 02:51:04 -07:00
2009-06-03 02:51:04 -07:00
2009-06-03 02:51:04 -07:00
2009-06-03 02:51:02 -07:00
2008-11-25 17:30:50 -08:00
2009-06-03 02:51:04 -07:00
2009-06-03 02:51:04 -07:00
2008-10-07 08:38:24 +11:00
2009-06-03 02:51:04 -07:00
2009-04-27 02:45:02 -07:00
2008-06-11 21:00:38 -07:00
2009-06-03 02:51:04 -07:00
2009-06-03 02:51:04 -07:00
2008-11-03 18:21:05 -08:00
2009-03-02 03:00:15 -08:00
2009-03-02 03:00:15 -08:00
2009-03-02 03:00:15 -08:00
2009-03-02 03:00:14 -08:00
2009-06-03 02:51:04 -07:00
2009-03-15 20:09:52 -07:00
2009-06-03 02:51:04 -07:00
2009-03-13 16:05:14 -07:00
2009-05-25 22:44:59 -07:00
2009-03-02 03:00:15 -08:00
2009-03-02 03:00:15 -08:00
2009-06-03 02:51:04 -07:00
2009-06-03 02:51:04 -07:00
2009-06-03 02:51:04 -07:00
2009-06-03 02:51:04 -07:00