sosend/soreceive consistency improvements

Brooks Davis brooks at one-eyed-alien.net
Mon Jul 24 17:32:16 UTC 2006


On Sun, Jul 23, 2006 at 07:57:56PM +0100, Robert Watson wrote:
> 
> As part of cleanups, locking, and optimization work, I've been looking at 
> the socket send and receive paths.
> 
> In the past, work was done do allow the uio/mbuf chain send and receive 
> paths (sosend, soreceive) to be pluggable for a protocol, so that the 
> protocol could provide substitute implementations.  This is not, generally, 
> currently used, although I recently changed UDP to use an optimized 
> datagram send routine. This pluggability is made possible by virtue of each 
> protocol providing its own pru_sosend() and pru_soreceive() methods in the 
> protocol switch.
> 
> There's another side to the pluggability, however -- the socket consumers 
> in the kernel, of which there are quite a few -- obviously the socket 
> system calls, but also netgraph, distributed file systems, etc.  Some of 
> these consumers have been modified to call 
> so->so_proto->pr_usrreqs->pru_soreceive and ...->pru_sosend, but it turns 
> out many haven't.  New references to sosend() and soreceive() periodically 
> get encoded into consumers -- presumably because they are easy to spell, 
> and in fact are generally functionally identical.  But not always!  It 
> turns out that the NFS code isn't using the optimized UDP send path via 
> sosend_dgram(), because it's calling sosend() directly.
> 
> Rather than continue in this "in between state", in which the uio/mbuf 
> chain sosend and soreceive are reached via the protocol switch in each 
> occurrence, I propose a change: sosend() and soreceive() will now be the 
> formal APIs for sending and receiveing on sockets within the kernel, as is 
> the case with many other so*() functions, and they will perform the 
> protocol switch dereference. The existing functions are renamed to 
> sosend_generic() and soreceive_generic(), and in most cases are never 
> referenced by protocols since our protocol domain registration already uses 
> sosend() and soreceive() as the defaults today.  The new code strikes me as 
> quite a bit more readable, and likely easier for socket consumers to use.
> 
> Any thoughts and/or objections?

Makes sense to me.  Is there an measurable performance impact?  I
wouldn't really expect much if any, but it's probably worth a check.
The function is a fairly obvious target for inlining if there is any.

-- Brooks
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-arch/attachments/20060724/6f843217/attachment.pgp


More information about the freebsd-arch mailing list