On Mon, Mar 06, 2017 at 01:33:19PM +0100, Martin Pieuchot wrote:
> After some refactoring, here's the updated diff to take the routing
> sockets out of the NET_LOCK().
>
> ok?
OK bluhm@
>
> Index: net/raw_usrreq.c
> ===================================================================
> RCS file: /cvs/src/sys/net/raw_usrreq.c,v
> retrieving revision 1.29
> diff -u -p -r1.29 raw_usrreq.c
> --- net/raw_usrreq.c 3 Mar 2017 15:48:02 -0000 1.29
> +++ net/raw_usrreq.c 6 Mar 2017 12:23:57 -0000
> @@ -63,7 +63,7 @@ raw_usrreq(struct socket *so, int req, s
> int error = 0;
> int len;
>
> - NET_ASSERT_LOCKED();
> + soassertlocked(so);
>
> if (req == PRU_CONTROL)
> return (EOPNOTSUPP);
> Index: net/route.h
> ===================================================================
> RCS file: /cvs/src/sys/net/route.h,v
> retrieving revision 1.159
> diff -u -p -r1.159 route.h
> --- net/route.h 6 Mar 2017 08:56:39 -0000 1.159
> +++ net/route.h 6 Mar 2017 12:26:14 -0000
> @@ -417,10 +417,6 @@ struct sockaddr_in6;
> struct bfd_config;
>
> void route_init(void);
> -int route_output(struct mbuf *, struct socket *, struct sockaddr *,
> - struct mbuf *);
> -int route_usrreq(struct socket *, int, struct mbuf *,
> - struct mbuf *, struct mbuf *, struct proc *);
> void rtm_ifchg(struct ifnet *);
> void rtm_ifannounce(struct ifnet *, int);
> void rtm_bfd(struct bfd_config *);
> Index: net/rtsock.c
> ===================================================================
> RCS file: /cvs/src/sys/net/rtsock.c,v
> retrieving revision 1.230
> diff -u -p -r1.230 rtsock.c
> --- net/rtsock.c 6 Mar 2017 10:19:17 -0000 1.230
> +++ net/rtsock.c 6 Mar 2017 12:28:11 -0000
> @@ -98,7 +98,11 @@ struct walkarg {
> caddr_t w_where, w_tmem;
> };
>
> +int route_output(struct mbuf *, struct socket *, struct sockaddr *,
> + struct mbuf *);
> int route_ctloutput(int, struct socket *, int, int, struct mbuf *);
> +int route_usrreq(struct socket *, int, struct mbuf *, struct mbuf *,
> + struct mbuf *, struct proc *);
> void route_input(struct mbuf *m0, sa_family_t);
> int route_arp_conflict(struct rtentry *, struct rt_addrinfo *);
> int route_cleargateway(struct rtentry *, void *, unsigned int);
> @@ -159,8 +163,6 @@ route_usrreq(struct socket *so, int req,
> int af;
> int error = 0;
>
> - NET_ASSERT_LOCKED();
> -
> rp = sotorawcb(so);
>
> switch (req) {
> @@ -345,6 +347,8 @@ route_input(struct mbuf *m0, sa_family_t
> struct socket *last = NULL;
> struct sockaddr *sosrc, *sodst;
>
> + KERNEL_ASSERT_LOCKED();
> +
> sosrc = &route_src;
> sodst = &route_dst;
>
> @@ -736,7 +740,9 @@ rtm_output(struct rt_msghdr *rtm, struct
> struct sockaddr_mpls *psa_mpls;
> #endif
> int plen, newgate = 0, error = 0;
> + int s;
>
> + NET_LOCK(s);
> switch (rtm->rtm_type) {
> case RTM_ADD:
> if (info->rti_info[RTAX_GATEWAY] == NULL) {
> @@ -981,6 +987,8 @@ change:
> error = ESRCH;
> break;
> }
> + NET_UNLOCK(s);
> +
> *prt = rt;
> return (error);
> }
> Index: kern/uipc_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_socket.c,v
> retrieving revision 1.178
> diff -u -p -r1.178 uipc_socket.c
> --- kern/uipc_socket.c 3 Mar 2017 09:41:20 -0000 1.178
> +++ kern/uipc_socket.c 6 Mar 2017 12:23:57 -0000
> @@ -1038,11 +1038,12 @@ sorflush(struct socket *so)
> {
> struct sockbuf *sb = &so->so_rcv;
> struct protosw *pr = so->so_proto;
> + sa_family_t af = pr->pr_domain->dom_family;
> struct sockbuf asb;
>
> sb->sb_flags |= SB_NOINTR;
> sblock(sb, M_WAITOK,
> - (pr->pr_domain->dom_family != PF_LOCAL) ? &netlock : NULL);
> + (af != PF_LOCAL && af != PF_ROUTE) ? &netlock : NULL);
> socantrcvmore(so);
> sbunlock(sb);
> asb = *sb;
> Index: kern/uipc_socket2.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_socket2.c,v
> retrieving revision 1.72
> diff -u -p -r1.72 uipc_socket2.c
> --- kern/uipc_socket2.c 14 Feb 2017 09:46:21 -0000 1.72
> +++ kern/uipc_socket2.c 6 Mar 2017 12:23:57 -0000
> @@ -273,7 +273,8 @@ solock(struct socket *so)
> {
> int s;
>
> - if (so->so_proto->pr_domain->dom_family != PF_LOCAL)
> + if ((so->so_proto->pr_domain->dom_family != PF_LOCAL) &&
> + (so->so_proto->pr_domain->dom_family != PF_ROUTE))
> NET_LOCK(s);
> else
> s = -42;
> @@ -291,16 +292,18 @@ sounlock(int s)
> void
> soassertlocked(struct socket *so)
> {
> - if (so->so_proto->pr_domain->dom_family != PF_LOCAL)
> + if ((so->so_proto->pr_domain->dom_family != PF_LOCAL) &&
> + (so->so_proto->pr_domain->dom_family != PF_ROUTE))
> NET_ASSERT_LOCKED();
> }
>
> int
> sosleep(struct socket *so, void *ident, int prio, const char *wmesg, int
> timo)
> {
> - if (so->so_proto->pr_domain->dom_family != PF_LOCAL)
> + if ((so->so_proto->pr_domain->dom_family != PF_LOCAL) &&
> + (so->so_proto->pr_domain->dom_family != PF_ROUTE)) {
> return rwsleep(ident, &netlock, prio, wmesg, timo);
> - else
> + } else
> return tsleep(ident, prio, wmesg, timo);
> }
>