Author: glebius
Date: Thu Sep 22 20:34:44 2016
New Revision: 306212
URL: https://svnweb.freebsd.org/changeset/base/306212

Log:
  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.
  
  Reviewed by:  pluknet, jtl, emax, rrs, lstewart, emax, gallatin, scottl

Modified:
  head/sys/kern/kern_sendfile.c

Modified: head/sys/kern/kern_sendfile.c
==============================================================================
--- head/sys/kern/kern_sendfile.c       Thu Sep 22 19:16:08 2016        
(r306211)
+++ head/sys/kern/kern_sendfile.c       Thu Sep 22 20:34:44 2016        
(r306212)
@@ -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;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to