Diff below move solock()/sounlock() outside of sobind(). It's the
next logical step to merge all the lock/unlock dances in nfs_connect().
ok?
Index: kern/uipc_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.199
diff -u -p -r1.199 uipc_socket.c
--- kern/uipc_socket.c 9 Aug 2017 14:22:58 -0000 1.199
+++ kern/uipc_socket.c 9 Aug 2017 23:31:24 -0000
@@ -152,11 +152,11 @@ socreate(int dom, struct socket **aso, i
int
sobind(struct socket *so, struct mbuf *nam, struct proc *p)
{
- int s, error;
+ int error;
+
+ soassertlocked(so);
- s = solock(so);
error = (*so->so_proto->pr_usrreq)(so, PRU_BIND, NULL, nam, NULL, p);
- sounlock(s);
return (error);
}
Index: kern/uipc_syscalls.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_syscalls.c,v
retrieving revision 1.157
diff -u -p -r1.157 uipc_syscalls.c
--- kern/uipc_syscalls.c 9 Aug 2017 14:22:58 -0000 1.157
+++ kern/uipc_syscalls.c 9 Aug 2017 23:31:24 -0000
@@ -184,7 +184,7 @@ sys_bind(struct proc *p, void *v, regist
struct file *fp;
struct mbuf *nam;
struct socket *so;
- int error;
+ int s, error;
if ((error = getsock(p, SCARG(uap, s), &fp)) != 0)
return (error);
@@ -201,7 +201,9 @@ sys_bind(struct proc *p, void *v, regist
if (KTRPOINT(p, KTR_STRUCT))
ktrsockaddr(p, mtod(nam, caddr_t), SCARG(uap, namelen));
#endif
+ s = solock(so);
error = sobind(so, nam, p);
+ sounlock(s);
m_freem(nam);
out:
FRELE(fp, p);
Index: net/if_pflow.c
===================================================================
RCS file: /cvs/src/sys/net/if_pflow.c,v
retrieving revision 1.80
diff -u -p -r1.80 if_pflow.c
--- net/if_pflow.c 31 May 2017 13:05:43 -0000 1.80
+++ net/if_pflow.c 9 Aug 2017 23:31:24 -0000
@@ -438,6 +438,7 @@ pflow_set(struct pflow_softc *sc, struct
return (error);
if (pflowvalidsockaddr(sc->sc_flowsrc, 1)) {
struct mbuf *m;
+ int s;
MGET(m, M_WAIT, MT_SONAME);
m->m_len = sc->sc_flowsrc->sa_len;
@@ -445,7 +446,9 @@ pflow_set(struct pflow_softc *sc, struct
memcpy(sa, sc->sc_flowsrc,
sc->sc_flowsrc->sa_len);
+ s = solock(so);
error = sobind(so, m, p);
+ sounlock(s);
m_freem(m);
if (error) {
soclose(so);
Index: nfs/krpc_subr.c
===================================================================
RCS file: /cvs/src/sys/nfs/krpc_subr.c,v
retrieving revision 1.30
diff -u -p -r1.30 krpc_subr.c
--- nfs/krpc_subr.c 9 Aug 2017 14:22:58 -0000 1.30
+++ nfs/krpc_subr.c 9 Aug 2017 23:31:24 -0000
@@ -283,7 +283,9 @@ krpc_call(struct sockaddr_in *sa, u_int
sin->sin_family = AF_INET;
sin->sin_addr.s_addr = INADDR_ANY;
sin->sin_port = htons(0);
+ s = solock(so);
error = sobind(so, m, &proc0);
+ sounlock(s);
m_freem(m);
if (error) {
printf("bind failed\n");
Index: nfs/nfs_socket.c
===================================================================
RCS file: /cvs/src/sys/nfs/nfs_socket.c,v
retrieving revision 1.121
diff -u -p -r1.121 nfs_socket.c
--- nfs/nfs_socket.c 9 Aug 2017 14:22:58 -0000 1.121
+++ nfs/nfs_socket.c 9 Aug 2017 23:31:24 -0000
@@ -275,7 +275,9 @@ nfs_connect(struct nfsmount *nmp, struct
sin->sin_family = AF_INET;
sin->sin_addr.s_addr = INADDR_ANY;
sin->sin_port = htons(0);
+ s = solock(so);
error = sobind(so, m, &proc0);
+ sounlock(s);
m_freem(m);
if (error)
goto bad;