cvs commit: src/sys/kern uipc_socket.c
Andre Oppermann
andre at freebsd.org
Mon Jan 22 15:01:06 UTC 2007
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
More information about the cvs-src
mailing list