> Date: Mon, 26 Nov 2012 20:37:22 +0100 > From: Mike Belopuhov <m...@belopuhov.com> > > 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?
Whenever a diff like this is proposed, it's worth considering to sprinkle in some splassert's. > 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);