> 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);

Reply via email to