We've discussed this with claudio and while there are might be some other related issues with pr_usrreq and spls, I think this particular diff needs to be committed. OK?
On Tue, Nov 13, 2012 at 14:18 -0500, David Hill wrote: > Hello - > > I originally asked mikeb if splnet was needed in net/pfkey.c. He added > onto my diff (which I have included below). I noticed route_usrreq from > net/rtsock.c calls raw_usrreq protected by splsoftnet. > > I thought I'd send it to tech@ to possibly get more feedback. > > Here is the diff I am running with. I haven't had any regressions. > > Index: sys/net/pfkey.c > =================================================================== > RCS file: /cvs/src/sys/net/pfkey.c,v > retrieving revision 1.19 > diff -N -u -p sys/net/pfkey.c > --- sys/net/pfkey.c 20 Sep 2012 10:25:03 -0000 1.19 > +++ sys/net/pfkey.c 11 Nov 2012 01:18:42 -0000 > @@ -198,15 +198,12 @@ static int > pfkey_attach(struct socket *socket, struct mbuf *proto, struct proc *p) > { > int rval; > - int s; > > if (!(socket->so_pcb = malloc(sizeof(struct rawcb), > M_PCB, M_DONTWAIT | M_ZERO))) > return (ENOMEM); > > - s = splnet(); > rval = raw_usrreq(socket, PRU_ATTACH, NULL, proto, NULL, p); > - splx(s); > if (rval) > goto ret; > > @@ -228,12 +225,10 @@ ret: > static int > pfkey_detach(struct socket *socket, struct proc *p) > { > - int rval, i, s; > + int rval, i; > > rval = pfkey_versions[socket->so_proto->pr_protocol]->release(socket); > - s = splnet(); > i = raw_usrreq(socket, PRU_DETACH, NULL, NULL, NULL, p); > - splx(s); > > if (!rval) > rval = i; > @@ -246,7 +241,6 @@ pfkey_usrreq(struct socket *socket, int req, struct mb > struct mbuf *nam, struct mbuf *control, struct proc *p) > { > int rval; > - int s; > > if ((socket->so_proto->pr_protocol > PFKEY_PROTOCOL_MAX) || > (socket->so_proto->pr_protocol < 0) || > @@ -261,9 +255,7 @@ pfkey_usrreq(struct socket *socket, int req, struct mb > return (pfkey_detach(socket, p)); > > default: > - s = splnet(); > rval = raw_usrreq(socket, req, mbuf, nam, control, p); > - splx(s); > } > > return (rval); > Index: sys/net/raw_usrreq.c > =================================================================== > RCS file: /cvs/src/sys/net/raw_usrreq.c,v > retrieving revision 1.14 > diff -N -u -p sys/net/raw_usrreq.c > --- sys/net/raw_usrreq.c 11 Jan 2012 23:47:06 -0000 1.14 > +++ sys/net/raw_usrreq.c 11 Nov 2012 01:18:42 -0000 > @@ -151,7 +151,7 @@ raw_usrreq(struct socket *so, int req, struct mbuf *m, > { > struct rawcb *rp = sotorawcb(so); > int error = 0; > - int len; > + int len, s; > > if (req == PRU_CONTROL) > return (EOPNOTSUPP); > @@ -163,6 +163,7 @@ raw_usrreq(struct socket *so, int req, struct mbuf *m, > error = EINVAL; > goto release; > } > + s = splsoftnet(); > switch (req) { > > /* > @@ -269,6 +270,7 @@ raw_usrreq(struct socket *so, int req, struct mbuf *m, > /* > * stat: don't bother with a blocksize. > */ > + splx(s); > return (0); > > /* > @@ -276,6 +278,7 @@ raw_usrreq(struct socket *so, int req, struct mbuf *m, > */ > case PRU_RCVOOB: > case PRU_RCVD: > + splx(s); > return (EOPNOTSUPP); > > case PRU_LISTEN: > @@ -308,6 +311,7 @@ raw_usrreq(struct socket *so, int req, struct mbuf *m, > panic("raw_usrreq"); > } > release: > + splx(s); > if (m != NULL) > m_freem(m); > return (error);