summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_syscalls.c
diff options
context:
space:
mode:
authorscottl <scottl@FreeBSD.org>2013-07-30 23:26:05 +0000
committerscottl <scottl@FreeBSD.org>2013-07-30 23:26:05 +0000
commit0eaffce7b350a432506f61d1240b4021dfced858 (patch)
tree60c2d9f5e9fd2f5d373f58c5e67f4dc9baf09de0 /sys/kern/uipc_syscalls.c
parentd13c0062851638685f23ad2a414ca3b0e71ba340 (diff)
downloadFreeBSD-src-0eaffce7b350a432506f61d1240b4021dfced858.zip
FreeBSD-src-0eaffce7b350a432506f61d1240b4021dfced858.tar.gz
Create a knob, kern.ipc.sfreadahead, that allows one to tune the amount of
readahead that sendfile() will do. Default remains the same. Obtained from: Netflix MFC after: 3 days
Diffstat (limited to 'sys/kern/uipc_syscalls.c')
-rw-r--r--sys/kern/uipc_syscalls.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 46ceef2..07e169e 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -122,6 +122,7 @@ counter_u64_t sfstat[sizeof(struct sfstat) / sizeof(uint64_t)];
int nsfbufs;
int nsfbufspeak;
int nsfbufsused;
+static int sfreadahead = MAXPHYS / MAXBSIZE;
SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufs, CTLFLAG_RDTUN, &nsfbufs, 0,
"Maximum number of sendfile(2) sf_bufs available");
@@ -129,6 +130,9 @@ SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufspeak, CTLFLAG_RD, &nsfbufspeak, 0,
"Number of sendfile(2) sf_bufs at peak usage");
SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufsused, CTLFLAG_RD, &nsfbufsused, 0,
"Number of sendfile(2) sf_bufs in use");
+SYSCTL_INT(_kern_ipc, OID_AUTO, sfreadahead, CTLFLAG_RW, &sfreadahead, 0,
+ "Number of sendfile(2) read-ahead MAXBSIZE blocks");
+
static void
sfstat_init(const void *unused)
@@ -2240,6 +2244,7 @@ retry_space:
error = EBUSY;
else {
ssize_t resid;
+ int readahead = sfreadahead * MAXBSIZE;
/*
* Ensure that our page is still around
@@ -2255,9 +2260,9 @@ retry_space:
* wrong, but is consistent with our original
* implementation.
*/
- error = vn_rdwr(UIO_READ, vp, NULL, MAXBSIZE,
+ error = vn_rdwr(UIO_READ, vp, NULL, readahead,
trunc_page(off), UIO_NOCOPY, IO_NODELOCKED |
- IO_VMIO | ((MAXBSIZE / bsize) << IO_SEQSHIFT),
+ IO_VMIO | ((readahead / bsize) << IO_SEQSHIFT),
td->td_ucred, NOCRED, &resid, td);
VM_OBJECT_WLOCK(obj);
vm_page_io_finish(pg);
OpenPOWER on IntegriCloud