svn commit: r306685 - stable/11/sys/kern
Gleb Smirnoff
glebius at FreeBSD.org
Tue Oct 4 20:26:19 UTC 2016
Author: glebius
Date: Tue Oct 4 20:26:18 2016
New Revision: 306685
URL: https://svnweb.freebsd.org/changeset/base/306685
Log:
Merge r306212:
Fix regression from r297400, which truncates headers in case of low socket
buffer and put a small optimization for low socket buffer case:
- Do not hack uio_resid, and let m_uiotombuf() properly take care of it. This
fixes truncation of headers at low buffer.
- If headers ate all the space, jump right to the end of the cycle, to
avoid doing single page I/O and allocating zero length mbuf.
- Clear hdr_uio only if space is positive, which indicates that all uio
was copied in.
Modified:
stable/11/sys/kern/kern_sendfile.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/kern/kern_sendfile.c
==============================================================================
--- stable/11/sys/kern/kern_sendfile.c Tue Oct 4 19:35:14 2016 (r306684)
+++ stable/11/sys/kern/kern_sendfile.c Tue Oct 4 20:26:18 2016 (r306685)
@@ -656,10 +656,18 @@ retry_space:
if (hdr_uio != NULL && hdr_uio->uio_resid > 0) {
hdr_uio->uio_td = td;
hdr_uio->uio_rw = UIO_WRITE;
- hdr_uio->uio_resid = min(hdr_uio->uio_resid, space);
- mh = m_uiotombuf(hdr_uio, M_WAITOK, 0, 0, 0);
+ mh = m_uiotombuf(hdr_uio, M_WAITOK, space, 0, 0);
hdrlen = m_length(mh, &mhtail);
space -= hdrlen;
+ /*
+ * If header consumed all the socket buffer space,
+ * don't waste CPU cycles and jump to the end.
+ */
+ if (space == 0) {
+ sfio = NULL;
+ nios = 0;
+ goto prepend_header;
+ }
hdr_uio = NULL;
}
@@ -806,6 +814,7 @@ retry_space:
/* Prepend header, if any. */
if (hdrlen) {
+prepend_header:
mhtail->m_next = m;
m = mh;
mh = NULL;
More information about the svn-src-stable-11
mailing list