Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Jan 2007 16:01:03 +0100
From:      Andre Oppermann <andre@freebsd.org>
To:        John Baldwin <jhb@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:  <45B4D1AF.9070101@freebsd.org>
In-Reply-To: <200701121206.47308.jhb@freebsd.org>
References:  <200611021745.kA2HjSZC018731@repoman.freebsd.org> <200701121206.47308.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
John Baldwin wrote:
> 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.

Fix is committed.  Thank you for tracking it down.

> 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. :)

We're always calling with M_WAITOK because we're coming from userland and
may sleep forever.

-- 
Andre




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