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