aboutsummaryrefslogtreecommitdiff
path: root/sys/nfsserver
diff options
context:
space:
mode:
authorRobert Watson <rwatson@FreeBSD.org>2004-06-17 22:48:11 +0000
committerRobert Watson <rwatson@FreeBSD.org>2004-06-17 22:48:11 +0000
commit9535efc00de36129762534223a2f5782cc5fe472 (patch)
tree743d1903dca8bb885b1a5cafc69c5ea6ff190d62 /sys/nfsserver
parentb2c082c98b71834582bad5480fdea168a89691c5 (diff)
downloadsrc-9535efc00de36129762534223a2f5782cc5fe472.tar.gz
src-9535efc00de36129762534223a2f5782cc5fe472.zip
Merge additional socket buffer locking from rwatson_netperf:
- Lock down low hanging fruit use of sb_flags with socket buffer lock. - Lock down low hanging fruit use of so_state with socket lock. - Lock down low hanging fruit use of so_options. - Lock down low-hanging fruit use of sb_lowwat and sb_hiwat with socket buffer lock. - Annotate situations in which we unlock the socket lock and then grab the receive socket buffer lock, which are currently actually the same lock. Depending on how we want to play our cards, we may want to coallesce these lock uses to reduce overhead. - Convert a if()->panic() into a KASSERT relating to so_state in soaccept(). - Remove a number of splnet()/splx() references. More complex merging of socket and socket buffer locking to follow.
Notes
Notes: svn path=/head/; revision=130653
Diffstat (limited to 'sys/nfsserver')
-rw-r--r--sys/nfsserver/nfs_syscalls.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/nfsserver/nfs_syscalls.c b/sys/nfsserver/nfs_syscalls.c
index 3c6bd562c804..d58fce4f6215 100644
--- a/sys/nfsserver/nfs_syscalls.c
+++ b/sys/nfsserver/nfs_syscalls.c
@@ -263,10 +263,14 @@ nfssvc_addsock(struct file *fp, struct sockaddr *mynam, struct thread *td)
val = 1;
sosetopt(so, &sopt);
}
+ SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_flags &= ~SB_NOINTR;
so->so_rcv.sb_timeo = 0;
+ SOCKBUF_UNLOCK(&so->so_rcv);
+ SOCKBUF_LOCK(&so->so_snd);
so->so_snd.sb_flags &= ~SB_NOINTR;
so->so_snd.sb_timeo = 0;
+ SOCKBUF_UNLOCK(&so->so_snd);
slp = (struct nfssvc_sock *)
malloc(sizeof (struct nfssvc_sock), M_NFSSVC,
@@ -285,7 +289,9 @@ nfssvc_addsock(struct file *fp, struct sockaddr *mynam, struct thread *td)
s = splnet();
so->so_upcallarg = (caddr_t)slp;
so->so_upcall = nfsrv_rcv;
+ SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_flags |= SB_UPCALL;
+ SOCKBUF_UNLOCK(&so->so_rcv);
slp->ns_flag = (SLP_VALID | SLP_NEEDQ);
nfsrv_wakenfsd(slp);
splx(s);
@@ -601,7 +607,9 @@ nfsrv_zapsock(struct nfssvc_sock *slp)
NFSD_UNLOCK();
slp->ns_fp = NULL;
so = slp->ns_so;
+ SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_flags &= ~SB_UPCALL;
+ SOCKBUF_UNLOCK(&so->so_rcv);
so->so_upcall = NULL;
so->so_upcallarg = NULL;
soshutdown(so, SHUT_RDWR);