I'd like to push the lock *inside* soconnect2(). This is mostly a noop as only AF_LOCAL support PRU_CONNECT2. But having less solock/sounlock dances in kern/uipc_syscalls.c helps mentally :)
ok? Index: kern/uipc_socket.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_socket.c,v retrieving revision 1.215 diff -u -p -r1.215 uipc_socket.c --- kern/uipc_socket.c 10 Jan 2018 18:14:34 -0000 1.215 +++ kern/uipc_socket.c 7 Feb 2018 14:40:14 -0000 @@ -337,11 +337,12 @@ soconnect(struct socket *so, struct mbuf int soconnect2(struct socket *so1, struct socket *so2) { - int error; + int s, error; - soassertlocked(so1); + s = solock(so1); error = (*so1->so_proto->pr_usrreq)(so1, PRU_CONNECT2, NULL, (struct mbuf *)so2, NULL, curproc); + sounlock(s); return (error); } Index: kern/uipc_syscalls.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_syscalls.c,v retrieving revision 1.162 diff -u -p -r1.162 uipc_syscalls.c --- kern/uipc_syscalls.c 9 Jan 2018 15:14:23 -0000 1.162 +++ kern/uipc_syscalls.c 7 Feb 2018 14:39:23 -0000 @@ -447,7 +447,7 @@ sys_socketpair(struct proc *p, void *v, struct filedesc *fdp = p->p_fd; struct file *fp1, *fp2; struct socket *so1, *so2; - int s, type, cloexec, nonblock, fflag, error, sv[2]; + int type, cloexec, nonblock, fflag, error, sv[2]; type = SCARG(uap, type) & ~(SOCK_CLOEXEC | SOCK_NONBLOCK); cloexec = (SCARG(uap, type) & SOCK_CLOEXEC) ? UF_EXCLOSE : 0; @@ -461,9 +461,7 @@ sys_socketpair(struct proc *p, void *v, if (error) goto free1; - s = solock(so1); error = soconnect2(so1, so2); - sounlock(s); if (error != 0) goto free2; @@ -471,9 +469,7 @@ sys_socketpair(struct proc *p, void *v, /* * Datagram socket connection is asymmetric. */ - s = solock(so2); error = soconnect2(so2, so1); - sounlock(s); if (error != 0) goto free2; } Index: miscfs/fifofs/fifo_vnops.c =================================================================== RCS file: /cvs/src/sys/miscfs/fifofs/fifo_vnops.c,v retrieving revision 1.62 diff -u -p -r1.62 fifo_vnops.c --- miscfs/fifofs/fifo_vnops.c 2 Jan 2018 06:38:45 -0000 1.62 +++ miscfs/fifofs/fifo_vnops.c 7 Feb 2018 14:38:38 -0000 @@ -143,14 +143,7 @@ fifo_open(void *v) return (error); } fip->fi_writesock = wso; - /* - * XXXSMP - * We only lock `wso' because AF_LOCAL sockets are - * still relying on the KERNEL_LOCK(). - */ - s = solock(wso); if ((error = soconnect2(wso, rso)) != 0) { - sounlock(s); (void)soclose(wso); (void)soclose(rso); free(fip, M_VNODE, sizeof *fip); @@ -158,6 +151,7 @@ fifo_open(void *v) return (error); } fip->fi_readers = fip->fi_writers = 0; + s = solock(wso); wso->so_state |= SS_CANTSENDMORE; wso->so_snd.sb_lowat = PIPE_BUF; } else {