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