Optimise kern_sendfile(): skip cycling through the entire mbuf chain in

m_cat(), storing pointer to last mbuf in chain in local variable and
attaching new mbuf to the end of chain.

Submitter reports that CPU load dropped for > 10% on a web server
serving large files with this optimisation.

Submitted by:	Sergey Budnevitch <sb nginx.com>
This commit is contained in:
Gleb Smirnoff 2012-06-04 12:49:21 +00:00
parent 784292f89a
commit 835d890042

View File

@ -1962,6 +1962,7 @@ kern_sendfile(struct thread *td, struct sendfile_args *uap,
* and takes care of the overall progress.
*/
for (off = uap->offset, rem = uap->nbytes; ; ) {
struct mbuf *mtail = NULL;
int loopbytes = 0;
int space = 0;
int done = 0;
@ -2181,10 +2182,15 @@ kern_sendfile(struct thread *td, struct sendfile_args *uap,
m0->m_len = xfsize;
/* Append to mbuf chain. */
if (m != NULL)
m_cat(m, m0);
else
m = m0;
if (mtail != NULL) {
mtail->m_next = m0;
} else {
if (m != NULL)
m_cat(m, m0);
else
m = m0;
}
mtail = m0;
/* Keep track of bits processed. */
loopbytes += xfsize;