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

Reply via email to