svn commit: r368448 - head/sys/net

Gleb Smirnoff glebius at FreeBSD.org
Tue Dec 8 16:46:01 UTC 2020


Author: glebius
Date: Tue Dec  8 16:46:00 2020
New Revision: 368448
URL: https://svnweb.freebsd.org/changeset/base/368448

Log:
  The list of ports in configuration path shall be protected by locks,
  epoch shall be used only for fast path.  Thus use LAGG_XLOCK() in
  lagg_[un]register_vlan.  This fixes sleeping in epoch panic.
  
  PR:		240609

Modified:
  head/sys/net/if_lagg.c

Modified: head/sys/net/if_lagg.c
==============================================================================
--- head/sys/net/if_lagg.c	Tue Dec  8 16:43:35 2020	(r368447)
+++ head/sys/net/if_lagg.c	Tue Dec  8 16:46:00 2020	(r368448)
@@ -471,17 +471,16 @@ lagg_proto_portreq(struct lagg_softc *sc, struct lagg_
 static void
 lagg_register_vlan(void *arg, struct ifnet *ifp, u_int16_t vtag)
 {
-	struct epoch_tracker et;
 	struct lagg_softc *sc = ifp->if_softc;
 	struct lagg_port *lp;
 
 	if (ifp->if_softc !=  arg)   /* Not our event */
 		return;
 
-	NET_EPOCH_ENTER(et);
+	LAGG_XLOCK(sc);
 	CK_SLIST_FOREACH(lp, &sc->sc_ports, lp_entries)
 		EVENTHANDLER_INVOKE(vlan_config, lp->lp_ifp, vtag);
-	NET_EPOCH_EXIT(et);
+	LAGG_XUNLOCK(sc);
 }
 
 /*
@@ -491,17 +490,16 @@ lagg_register_vlan(void *arg, struct ifnet *ifp, u_int
 static void
 lagg_unregister_vlan(void *arg, struct ifnet *ifp, u_int16_t vtag)
 {
-	struct epoch_tracker et;
 	struct lagg_softc *sc = ifp->if_softc;
 	struct lagg_port *lp;
 
 	if (ifp->if_softc !=  arg)   /* Not our event */
 		return;
 
-	NET_EPOCH_ENTER(et);
+	LAGG_XLOCK(sc);
 	CK_SLIST_FOREACH(lp, &sc->sc_ports, lp_entries)
 		EVENTHANDLER_INVOKE(vlan_unconfig, lp->lp_ifp, vtag);
-	NET_EPOCH_EXIT(et);
+	LAGG_XUNLOCK(sc);
 }
 
 static int


More information about the svn-src-head mailing list