]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Add soreceive_stream(), an optimized version of soreceive() for
authorandre <andre@FreeBSD.org>
Mon, 22 Jun 2009 23:08:05 +0000 (23:08 +0000)
committerandre <andre@FreeBSD.org>
Mon, 22 Jun 2009 23:08:05 +0000 (23:08 +0000)
commite66ed06df4c21fd9f4560ed95be34c4f650648dc
treef56606825e9225b57340aa08d56a8043bfc65081
parent3a5ae5dccd1557135d98007edc27fad43d830dde
Add soreceive_stream(), an optimized version of soreceive() for
stream (TCP) sockets.

It is functionally identical to generic soreceive() but has a
number stream specific optimizations:
o does only one sockbuf unlock/lock per receive independent of
  the length of data to be moved into the uio compared to
  soreceive() which unlocks/locks per *mbuf*.
o uses m_mbuftouio() instead of its own copy(out) variant.
o much more compact code flow as a large number of special
  cases is removed.
o much improved reability.

It offers significantly reduced CPU usage and lock contention
when receiving fast TCP streams.  Additional gains are obtained
when the receiving application is using SO_RCVLOWAT to batch up
some data before a read (and wakeup) is done.

This function was written by "reverse engineering" and is not
just a stripped down variant of soreceive().

It is not yet enabled by default on TCP sockets.  Instead it is
commented out in the protocol initialization in tcp_usrreq.c
until more widespread testing has been done.

Testers, especially with 10GigE gear, are welcome.

MFP4: r164817 //depot/user/andre/soreceive_stream/
sys/kern/uipc_socket.c
sys/netinet/tcp_usrreq.c
sys/sys/socketvar.h