On Sun, May 28, 2017 at 11:09:39AM +0200, Martin Pieuchot wrote: > - if_deactivate() needs the NET_LOCK() for carp_ifdetach(). splnet() is > not need here since if_deactivate() deals with pseudo-interface hooks. > > - carp_clone_destroy() needs to grab the NET_LOCK(). > > In both cases we want to protect the list of joined IP multicast groups. > This list is accessed in the packet processing path. > > ok?
OK bluhm@ > > Index: net/if.c > =================================================================== > RCS file: /cvs/src/sys/net/if.c,v > retrieving revision 1.497 > diff -u -p -r1.497 if.c > --- net/if.c 16 May 2017 12:24:01 -0000 1.497 > +++ net/if.c 28 May 2017 09:02:21 -0000 > @@ -977,8 +977,7 @@ if_deactivate(struct ifnet *ifp) > { > int s; > > - s = splnet(); > - > + NET_LOCK(s); > /* > * Call detach hooks from head to tail. To make sure detach > * hooks are executed in the reverse order they were added, all > @@ -991,8 +990,7 @@ if_deactivate(struct ifnet *ifp) > if (ifp->if_carp && ifp->if_type != IFT_CARP) > carp_ifdetach(ifp); > #endif > - > - splx(s); > + NET_UNLOCK(s); > } > > /* > Index: netinet/ip_carp.c > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_carp.c,v > retrieving revision 1.310 > diff -u -p -r1.310 ip_carp.c > --- netinet/ip_carp.c 27 May 2017 21:55:52 -0000 1.310 > +++ netinet/ip_carp.c 28 May 2017 09:05:47 -0000 > @@ -870,8 +870,12 @@ int > carp_clone_destroy(struct ifnet *ifp) > { > struct carp_softc *sc = ifp->if_softc; > + int s; > > + NET_LOCK(s); > carpdetach(sc); > + NET_UNLOCK(s); > + > ether_ifdetach(ifp); > if_detach(ifp); > carp_destroy_vhosts(ifp->if_softc);