On Tue, Sep 20, 2016 at 04:17:37PM +0200, Mike Belopuhov wrote: > On 20 September 2016 at 15:55, Alexander Bluhm <alexander.bl...@gmx.net> > wrote: > > On Tue, Sep 20, 2016 at 08:21:55AM -0400, David Hill wrote: > >> With bluhm's r1.160 uipc_socket.c. > > > > With splsoftnet() in soshutdown() I can fix this one. > > > > splassert: sowwakeup: want 5 have 0 > > Starting stack trace... > > splassert_check() at splassert_check+0x78 > > sowwakeup() at sowwakeup+0x27 > > uipc_usrreq() at uipc_usrreq+0xfd > > sys_shutdown() at sys_shutdown+0x67 > > syscall() at syscall+0x27b > > --- syscall (number 134) --- > > end of kernel > > end trace frame: 0xe8f2cba5e80, count: 252 > > 0xe8f305dc16a: > > End of stack trace. > > > > ok? > > > > OK mikeb > > Can we assert that *_usrreq is always called under splsoftnet? > I recall fixing some of them for raw sockets and some such and > was wondering if the spl has to be raised before we end up there. >
Just playing around with splsoftassert's and had to add the following splsoftnet's to get my machine to be quiet. Index: kern/sys_socket.c =================================================================== RCS file: /cvs/src/sys/kern/sys_socket.c,v retrieving revision 1.22 diff -u -p -r1.22 sys_socket.c --- kern/sys_socket.c 6 Oct 2016 17:02:10 -0000 1.22 +++ kern/sys_socket.c 18 Oct 2016 20:15:47 -0000 @@ -167,6 +167,7 @@ int soo_stat(struct file *fp, struct stat *ub, struct proc *p) { struct socket *so = fp->f_data; + int s; memset(ub, 0, sizeof (*ub)); ub->st_mode = S_IFSOCK; @@ -177,8 +178,10 @@ soo_stat(struct file *fp, struct stat *u ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; ub->st_uid = so->so_euid; ub->st_gid = so->so_egid; + s = splsoftnet(); (void) ((*so->so_proto->pr_usrreq)(so, PRU_SENSE, (struct mbuf *)ub, NULL, NULL, p)); + splx(s); return (0); } Index: kern/uipc_syscalls.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_syscalls.c,v retrieving revision 1.135 diff -u -p -r1.135 uipc_syscalls.c --- kern/uipc_syscalls.c 8 Oct 2016 02:16:43 -0000 1.135 +++ kern/uipc_syscalls.c 18 Oct 2016 20:15:47 -0000 @@ -1049,7 +1049,7 @@ sys_getsockname(struct proc *p, void *v, struct socket *so; struct mbuf *m = NULL; socklen_t len; - int error; + int error, s; if ((error = getsock(p, SCARG(uap, fdes), &fp)) != 0) return (error); @@ -1061,7 +1061,9 @@ sys_getsockname(struct proc *p, void *v, if (error) goto bad; m = m_getclr(M_WAIT, MT_SONAME); + s = splsoftnet(); error = (*so->so_proto->pr_usrreq)(so, PRU_SOCKADDR, 0, m, 0, p); + splx(s); if (error) goto bad; error = copyaddrout(p, m, SCARG(uap, asa), len, SCARG(uap, alen)); @@ -1087,7 +1089,7 @@ sys_getpeername(struct proc *p, void *v, struct socket *so; struct mbuf *m = NULL; socklen_t len; - int error; + int error, s; if ((error = getsock(p, SCARG(uap, fdes), &fp)) != 0) return (error); @@ -1103,7 +1105,9 @@ sys_getpeername(struct proc *p, void *v, if (error) goto bad; m = m_getclr(M_WAIT, MT_SONAME); + s = splsoftnet(); error = (*so->so_proto->pr_usrreq)(so, PRU_PEERADDR, 0, m, 0, p); + splx(s); if (error) goto bad; error = copyaddrout(p, m, SCARG(uap, asa), len, SCARG(uap, alen)); Index: net/if.c =================================================================== RCS file: /cvs/src/sys/net/if.c,v retrieving revision 1.455 diff -u -p -r1.455 if.c --- net/if.c 16 Oct 2016 21:45:17 -0000 1.455 +++ net/if.c 18 Oct 2016 20:15:47 -0000 @@ -2072,9 +2072,11 @@ ifioctl(struct socket *so, u_long cmd, c default: if (so->so_proto == 0) return (EOPNOTSUPP); + s = splsoftnet(); error = ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL, (struct mbuf *) cmd, (struct mbuf *) data, (struct mbuf *) ifp, p)); + splx(s); break; } Index: net/pfkey.c =================================================================== RCS file: /cvs/src/sys/net/pfkey.c,v retrieving revision 1.31 diff -u -p -r1.31 pfkey.c --- net/pfkey.c 5 Sep 2016 15:12:30 -0000 1.31 +++ net/pfkey.c 18 Oct 2016 20:15:47 -0000 @@ -242,6 +242,8 @@ pfkey_usrreq(struct socket *socket, int { int rval; + splsoftassert(IPL_SOFTNET); + if ((socket->so_proto->pr_protocol > PFKEY_PROTOCOL_MAX) || (socket->so_proto->pr_protocol < 0) || !pfkey_versions[socket->so_proto->pr_protocol]) Index: net/raw_usrreq.c =================================================================== RCS file: /cvs/src/sys/net/raw_usrreq.c,v retrieving revision 1.25 diff -u -p -r1.25 raw_usrreq.c --- net/raw_usrreq.c 8 Oct 2016 03:32:25 -0000 1.25 +++ net/raw_usrreq.c 18 Oct 2016 20:15:47 -0000 @@ -139,6 +139,8 @@ raw_usrreq(struct socket *so, int req, s int error = 0; int len, s; + splsoftassert(IPL_SOFTNET); + if (req == PRU_CONTROL) return (EOPNOTSUPP); if (control && control->m_len) { Index: net/rtsock.c =================================================================== RCS file: /cvs/src/sys/net/rtsock.c,v retrieving revision 1.208 diff -u -p -r1.208 rtsock.c --- net/rtsock.c 18 Oct 2016 11:05:45 -0000 1.208 +++ net/rtsock.c 18 Oct 2016 20:15:47 -0000 @@ -152,6 +152,8 @@ route_usrreq(struct socket *so, int req, int s, af; int error = 0; + splsoftassert(IPL_SOFTNET); + s = splsoftnet(); rp = sotorawcb(so); Index: netinet/tcp_usrreq.c =================================================================== RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v retrieving revision 1.135 diff -u -p -r1.135 tcp_usrreq.c --- netinet/tcp_usrreq.c 24 Sep 2016 14:51:37 -0000 1.135 +++ netinet/tcp_usrreq.c 18 Oct 2016 20:15:47 -0000 @@ -134,6 +134,8 @@ tcp_usrreq(struct socket *so, int req, s int error = 0; short ostate; + splsoftassert(IPL_SOFTNET); + if (req == PRU_CONTROL) { #ifdef INET6 if (sotopf(so) == PF_INET6) Index: netinet/udp_usrreq.c =================================================================== RCS file: /cvs/src/sys/netinet/udp_usrreq.c,v retrieving revision 1.219 diff -u -p -r1.219 udp_usrreq.c --- netinet/udp_usrreq.c 3 Sep 2016 13:46:57 -0000 1.219 +++ netinet/udp_usrreq.c 18 Oct 2016 20:15:47 -0000 @@ -1112,6 +1112,8 @@ udp_usrreq(struct socket *so, int req, s int error = 0; int s; + splsoftassert(IPL_SOFTNET); + if (req == PRU_CONTROL) { #ifdef INET6 if (sotopf(so) == PF_INET6) Index: netinet6/raw_ip6.c =================================================================== RCS file: /cvs/src/sys/netinet6/raw_ip6.c,v retrieving revision 1.96 diff -u -p -r1.96 raw_ip6.c --- netinet6/raw_ip6.c 19 Sep 2016 18:09:09 -0000 1.96 +++ netinet6/raw_ip6.c 18 Oct 2016 20:15:48 -0000 @@ -571,6 +571,8 @@ rip6_usrreq(struct socket *so, int req, int s; int priv; + splsoftassert(IPL_SOFTNET); + priv = 0; if ((so->so_state & SS_PRIV) != 0) priv++;