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