On Mon, Apr 17, 2023 at 03:16:36AM +0300, Vitaliy Makkoveev wrote: > Index: sys/dev/usb/if_umb.c > =================================================================== > RCS file: /cvs/src/sys/dev/usb/if_umb.c,v > retrieving revision 1.50 > diff -u -p -r1.50 if_umb.c > --- sys/dev/usb/if_umb.c 31 Mar 2023 23:53:49 -0000 1.50 > +++ sys/dev/usb/if_umb.c 17 Apr 2023 00:09:17 -0000 > @@ -1829,6 +1829,7 @@ umb_add_inet_config(struct umb_softc *sc > default_sin.sin_len = sizeof (default_sin); > > memset(&info, 0, sizeof(info)); > + NET_LOCK(); > info.rti_flags = RTF_GATEWAY /* maybe | RTF_STATIC */; > info.rti_ifa = ifa_ifwithaddr(sintosa(&ifra.ifra_addr), > ifp->if_rdomain); > @@ -1836,7 +1837,6 @@ umb_add_inet_config(struct umb_softc *sc > info.rti_info[RTAX_NETMASK] = sintosa(&default_sin); > info.rti_info[RTAX_GATEWAY] = sintosa(&ifra.ifra_dstaddr); > > - NET_LOCK(); > rv = rtrequest(RTM_ADD, &info, 0, &rt, ifp->if_rdomain); > NET_UNLOCK(); > if (rv) { > @@ -1910,6 +1910,7 @@ umb_add_inet6_config(struct umb_softc *s > default_sin6.sin6_len = sizeof (default_sin6); > > memset(&info, 0, sizeof(info)); > + NET_LOCK(); > info.rti_flags = RTF_GATEWAY /* maybe | RTF_STATIC */; > info.rti_ifa = ifa_ifwithaddr(sin6tosa(&ifra.ifra_addr), > ifp->if_rdomain); > @@ -1917,7 +1918,6 @@ umb_add_inet6_config(struct umb_softc *s > info.rti_info[RTAX_NETMASK] = sin6tosa(&default_sin6); > info.rti_info[RTAX_GATEWAY] = sin6tosa(&ifra.ifra_dstaddr); > > - NET_LOCK(); > rv = rtrequest(RTM_ADD, &info, 0, &rt, ifp->if_rdomain); > NET_UNLOCK(); > if (rv) {
This umb chunk is OK bluhm@ > Index: sys/net/if.c > =================================================================== > RCS file: /cvs/src/sys/net/if.c,v > retrieving revision 1.688 > diff -u -p -r1.688 if.c > --- sys/net/if.c 8 Apr 2023 13:49:38 -0000 1.688 > +++ sys/net/if.c 17 Apr 2023 00:09:17 -0000 > @@ -1409,8 +1409,9 @@ ifa_ifwithaddr(struct sockaddr *addr, u_ > struct ifaddr *ifa; > u_int rdomain; > > + NET_ASSERT_LOCKED(); > + > rdomain = rtable_l2(rtableid); > - KERNEL_LOCK(); > TAILQ_FOREACH(ifp, &ifnetlist, if_list) { > if (ifp->if_rdomain != rdomain) > continue; > @@ -1420,12 +1421,10 @@ ifa_ifwithaddr(struct sockaddr *addr, u_ > continue; > > if (equal(addr, ifa->ifa_addr)) { > - KERNEL_UNLOCK(); > return (ifa); > } > } > } > - KERNEL_UNLOCK(); > return (NULL); > } ifa_ifwithdstaddr() is iterating over the same loops. It should be changed together. if_unit() is iterating over if_list. There should be a NET_LOCK(). TAILQ_ENTRY(ifnet) if_list; /* [K] all struct ifnets are chained */ TAILQ_ENTRY(ifaddr) ifa_list; /* list of addresses for interface */ Could you put an [N] there? Can we put an NET_ASSERT_LOCKED_EXCLUSIVE() in ifa_add() and ifa_del()? > Index: sys/net/rtsock.c > =================================================================== > RCS file: /cvs/src/sys/net/rtsock.c,v > retrieving revision 1.359 > diff -u -p -r1.359 rtsock.c > --- sys/net/rtsock.c 22 Jan 2023 12:05:44 -0000 1.359 > +++ sys/net/rtsock.c 17 Apr 2023 00:09:17 -0000 > @@ -2374,18 +2374,18 @@ rt_setsource(unsigned int rtableid, stru > return (EAFNOSUPPORT); > } > > - KERNEL_LOCK(); > + NET_LOCK(); > /* > * Check if source address is assigned to an interface in the > * same rdomain > */ > if ((ifa = ifa_ifwithaddr(src, rtableid)) == NULL) { > - KERNEL_UNLOCK(); > + NET_UNLOCK(); > return (EINVAL); > } > > error = rtable_setsource(rtableid, src->sa_family, ifa->ifa_addr); > - KERNEL_UNLOCK(); > + NET_UNLOCK(); > > return (error); > } I would perfer to put the NET_LOCK() into the caller. There are two more rtable_setsource() in this function which should be net locked.