net: Introduce skb_orphan_try()
authorEric Dumazet <eric.dumazet@gmail.com>
Fri, 16 Apr 2010 12:18:22 +0000 (12:18 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 18 Apr 2010 09:39:41 +0000 (02:39 -0700)
commitfc6055a5ba31e2c14e36e8939f9bf2b6d586a7f5
treeb55954230d0d849d1f7b0517ced4cc1ee6fd8157
parent9958da0501fced47c1ac5c5a3a7731c87e45472c
net: Introduce skb_orphan_try()

Transmitted skb might be attached to a socket and a destructor, for
memory accounting purposes.

Traditionally, this destructor is called at tx completion time, when skb
is freed.

When tx completion is performed by another cpu than the sender, this
forces some cache lines to change ownership. XPS was an attempt to give
tx completion to initial cpu.

David idea is to call destructor right before giving skb to device (call
to ndo_start_xmit()). Because device queues are usually small, orphaning
skb before tx completion is not a big deal. Some drivers already do
this, we could do it in upper level.

There is one known exception to this early orphaning, called tx
timestamping. It needs to keep a reference to socket until device can
give a hardware or software timestamp.

This patch adds a skb_orphan_try() helper, to centralize all exceptions
to early orphaning in one spot, and use it in dev_hard_start_xmit().

"tbench 16" results on a Nehalem machine (2 X5570  @ 2.93GHz)
before: Throughput 4428.9 MB/sec 16 procs
after: Throughput 4448.14 MB/sec 16 procs

UDP should get even better results, its destructor being more complex,
since SOCK_USE_WRITE_QUEUE is not set (four atomic ops instead of one)

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c