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