summaryrefslogtreecommitdiffstats
path: root/sys/nfsserver/nfs_srvsock.c
diff options
context:
space:
mode:
authordillon <dillon@FreeBSD.org>2000-03-27 21:38:35 +0000
committerdillon <dillon@FreeBSD.org>2000-03-27 21:38:35 +0000
commitd7295a1a39d1518cf454629be7cb8e3e0623831d (patch)
treef4dd9c13115dc5e1bab374059995b9003ac013fb /sys/nfsserver/nfs_srvsock.c
parent5ccef75e02afa360480c05b8d01bdd8f2abc39bc (diff)
downloadFreeBSD-src-d7295a1a39d1518cf454629be7cb8e3e0623831d.zip
FreeBSD-src-d7295a1a39d1518cf454629be7cb8e3e0623831d.tar.gz
Add a sysctl to specify the amount of UDP receive space NFS should
reserve, in maximal NFS packets. Originally only 2 packets worth of space was reserved. The default is now 4, which appears to greatly improve performance for slow to mid-speed machines on gigabit networks. Add documentation and correct some prior documentation. Problem Researched by: Andrew Gallatin <gallatin@cs.duke.edu> Approved by: jkh
Diffstat (limited to 'sys/nfsserver/nfs_srvsock.c')
-rw-r--r--sys/nfsserver/nfs_srvsock.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/sys/nfsserver/nfs_srvsock.c b/sys/nfsserver/nfs_srvsock.c
index b2d6bf5..7d8bec4 100644
--- a/sys/nfsserver/nfs_srvsock.c
+++ b/sys/nfsserver/nfs_srvsock.c
@@ -119,11 +119,13 @@ static int proct[NFS_NPROCS] = {
static int nfs_realign_test;
static int nfs_realign_count;
+static int nfs_bufpackets = 4;
SYSCTL_DECL(_vfs_nfs);
-SYSCTL_INT(_vfs_nfs, OID_AUTO, realign_test, CTLFLAG_RD, &nfs_realign_test, 0, "");
-SYSCTL_INT(_vfs_nfs, OID_AUTO, realign_count, CTLFLAG_RD, &nfs_realign_count, 0, "");
+SYSCTL_INT(_vfs_nfs, OID_AUTO, realign_test, CTLFLAG_RW, &nfs_realign_test, 0, "");
+SYSCTL_INT(_vfs_nfs, OID_AUTO, realign_count, CTLFLAG_RW, &nfs_realign_count, 0, "");
+SYSCTL_INT(_vfs_nfs, OID_AUTO, bufpackets, CTLFLAG_RW, &nfs_bufpackets, 0, "");
/*
@@ -201,6 +203,7 @@ nfs_connect(nmp, rep)
{
register struct socket *so;
int s, error, rcvreserve, sndreserve;
+ int pktscale;
struct sockaddr *saddr;
struct sockaddr_in *sin;
struct proc *p = &proc0; /* only used for socreate and sobind */
@@ -301,14 +304,25 @@ nfs_connect(nmp, rep)
so->so_rcv.sb_timeo = 0;
so->so_snd.sb_timeo = 0;
}
+
+ /*
+ * Get buffer reservation size from sysctl, but impose reasonable
+ * limits.
+ */
+ pktscale = nfs_bufpackets;
+ if (pktscale < 2)
+ pktscale = 2;
+ if (pktscale > 64)
+ pktscale = 64;
+
if (nmp->nm_sotype == SOCK_DGRAM) {
- sndreserve = (nmp->nm_wsize + NFS_MAXPKTHDR) * 2;
+ sndreserve = (nmp->nm_wsize + NFS_MAXPKTHDR) * pktscale;
rcvreserve = (max(nmp->nm_rsize, nmp->nm_readdirsize) +
- NFS_MAXPKTHDR) * 2;
+ NFS_MAXPKTHDR) * pktscale;
} else if (nmp->nm_sotype == SOCK_SEQPACKET) {
- sndreserve = (nmp->nm_wsize + NFS_MAXPKTHDR) * 2;
+ sndreserve = (nmp->nm_wsize + NFS_MAXPKTHDR) * pktscale;
rcvreserve = (max(nmp->nm_rsize, nmp->nm_readdirsize) +
- NFS_MAXPKTHDR) * 2;
+ NFS_MAXPKTHDR) * pktscale;
} else {
if (nmp->nm_sotype != SOCK_STREAM)
panic("nfscon sotype");
@@ -337,9 +351,9 @@ nfs_connect(nmp, rep)
sosetopt(so, &sopt);
}
sndreserve = (nmp->nm_wsize + NFS_MAXPKTHDR +
- sizeof (u_int32_t)) * 2;
+ sizeof (u_int32_t)) * pktscale;
rcvreserve = (nmp->nm_rsize + NFS_MAXPKTHDR +
- sizeof (u_int32_t)) * 2;
+ sizeof (u_int32_t)) * pktscale;
}
error = soreserve(so, sndreserve, rcvreserve);
if (error)
OpenPOWER on IntegriCloud