Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 Oct 2016 20:26:18 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r306685 - stable/11/sys/kern
Message-ID:  <201610042026.u94KQIpw040727@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



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