Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 12 Jan 2007 12:06:46 -0500
From:      John Baldwin <jhb@freebsd.org>
To:        Andre Oppermann <andre@freebsd.org>
Cc:        cvs-src@freebsd.org, src-committers@freebsd.org, cvs-all@freebsd.org
Subject:   Re: cvs commit: src/sys/kern uipc_socket.c
Message-ID:  <200701121206.47308.jhb@freebsd.org>
In-Reply-To: <200611021745.kA2HjSZC018731@repoman.freebsd.org>
References:  <200611021745.kA2HjSZC018731@repoman.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday 02 November 2006 12:45, Andre Oppermann wrote:
> andre       2006-11-02 17:45:28 UTC
> 
>   FreeBSD src repository
> 
>   Modified files:
>     sys/kern             uipc_socket.c 
>   Log:
>   Use the improved m_uiotombuf() function instead of home grown sosend_copyin()
>   to do the userland to kernel copying in sosend_generic() and sosend_dgram().
>   
>   sosend_copyin() is retained for ZERO_COPY_SOCKETS which are not yet supported
>   by m_uiotombuf().
>   
>   Benchmaring shows significant improvements (95% confidence):
>    66% less cpu (or 2.9 times better) with new sosend vs. old sosend (non-TSO)
>    65% less cpu (or 2.8 times better) with new sosend vs. old sosend (TSO)
>   
>   (Sender AMD Opteron 852 (2.6GHz) with em(4) PCI-X-133 interface and receiver
>   DELL Poweredge SC1425 P-IV Xeon 3.2GHz with em(4) LOM connected back to back
>   at 1000Base-TX full duplex.)
>   
>   Sponsored by:   TCP/IP Optimization Fundraise 2005
>   MFC after:      3 month

This breaks writes of 0 bytes (e.g. write(s, NULL, 0)) to sockets because
m_getm2(NULL, 0, ...) returns NULL and thus m_uiotombuf() returns NULL and
sosend_*() now return EFAULT.  sosend_copyin() correctly handles this case
since it always allocates at least one mbuf.  I'm not sure if m_uiotombuf()
is at fault or if something else is, so I'll let you fix it.  This explains
the recent breakage of kcheckpass (KDE screen saver password checker) on
current, and possibly other things as well.

Also, you've introduced another regression in that if the m_get2m() fails it
should be returning ENOBUFS and not EFAULT to userland.  The comments in
sosend_*() about 'EFAULT being the only possible error' are obviously
wrong. :)

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200701121206.47308.jhb>