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:
parent
784292f89a
commit
835d890042
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user