On Sat, May 27, 2017 at 06:37:48PM +0200, Claudio Jeker wrote: > Similar to the routing socket the pfkey socket only needs the > netlock further down (in pfkeyv2_send()). With this all users of > raw_usrreq are now not using the NET_LOCK which should simplify to push > the NET_LOCK down.
In sorflush() we have sa_family_t af = pr->pr_domain->dom_family; sblock(sb, M_WAITOK, (af != PF_LOCAL && af != PF_ROUTE) ? &netlock : NULL); I think you should keep that in sync and add PF_KEY here. bluhm > > OK? > -- > :wq Claudio > > Index: kern/uipc_socket2.c > =================================================================== > RCS file: /cvs/src/sys/kern/uipc_socket2.c,v > retrieving revision 1.76 > diff -u -p -r1.76 uipc_socket2.c > --- kern/uipc_socket2.c 15 May 2017 12:26:00 -0000 1.76 > +++ kern/uipc_socket2.c 27 May 2017 14:04:34 -0000 > @@ -273,7 +273,8 @@ solock(struct socket *so) > int s; > > if ((so->so_proto->pr_domain->dom_family != PF_LOCAL) && > - (so->so_proto->pr_domain->dom_family != PF_ROUTE)) > + (so->so_proto->pr_domain->dom_family != PF_ROUTE) && > + (so->so_proto->pr_domain->dom_family != PF_KEY)) > NET_LOCK(s); > else > s = -42; > @@ -292,7 +293,8 @@ void > soassertlocked(struct socket *so) > { > if ((so->so_proto->pr_domain->dom_family != PF_LOCAL) && > - (so->so_proto->pr_domain->dom_family != PF_ROUTE)) > + (so->so_proto->pr_domain->dom_family != PF_ROUTE) && > + (so->so_proto->pr_domain->dom_family != PF_KEY)) > NET_ASSERT_LOCKED(); > } > > @@ -300,7 +302,8 @@ int > sosleep(struct socket *so, void *ident, int prio, const char *wmesg, int > timo) > { > if ((so->so_proto->pr_domain->dom_family != PF_LOCAL) && > - (so->so_proto->pr_domain->dom_family != PF_ROUTE)) { > + (so->so_proto->pr_domain->dom_family != PF_ROUTE) && > + (so->so_proto->pr_domain->dom_family != PF_KEY)) { > return rwsleep(ident, &netlock, prio, wmesg, timo); > } else > return tsleep(ident, prio, wmesg, timo); > Index: net/pfkeyv2.c > =================================================================== > RCS file: /cvs/src/sys/net/pfkeyv2.c,v > retrieving revision 1.156 > diff -u -p -r1.156 pfkeyv2.c > --- net/pfkeyv2.c 26 May 2017 19:11:20 -0000 1.156 > +++ net/pfkeyv2.c 27 May 2017 16:24:37 -0000 > @@ -795,7 +795,7 @@ pfkeyv2_get_proto_alg(u_int8_t satype, u > int > pfkeyv2_send(struct socket *socket, void *message, int len) > { > - int i, j, rval = 0, mode = PFKEYV2_SENDMESSAGE_BROADCAST; > + int i, j, s, rval = 0, mode = PFKEYV2_SENDMESSAGE_BROADCAST; > int delflag = 0; > struct sockaddr_encap encapdst, encapnetmask; > struct ipsec_policy *ipo, *tmpipo; > @@ -820,7 +820,7 @@ pfkeyv2_send(struct socket *socket, void > > u_int rdomain; > > - NET_ASSERT_LOCKED(); > + NET_LOCK(s); > > /* Verify that we received this over a legitimate pfkeyv2 socket */ > bzero(headers, sizeof(headers)); > @@ -1356,7 +1356,6 @@ pfkeyv2_send(struct socket *socket, void > rval = tdb_walk(rdomain, pfkeyv2_dump_walker, &dump_state); > if (!rval) > goto realret; > - > if ((rval == ENOMEM) || (rval == ENOBUFS)) > rval = 0; > } > @@ -1690,6 +1689,8 @@ ret: > rval = pfkeyv2_sendmessage(headers, mode, socket, 0, 0, rdomain); > > realret: > + NET_UNLOCK(s); > + > if (freeme) > free(freeme, M_PFKEY, 0); >