After some refactoring, here's the updated diff to take the routing
sockets out of the NET_LOCK().

ok?

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

Reply via email to