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