Any thoughts?
On Tue, Nov 13, 2012 at 02:18:35PM -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);