svn commit: r353467 - head/sys/net

Gleb Smirnoff glebius at FreeBSD.org
Sun Oct 13 15:15:10 UTC 2019


Author: glebius
Date: Sun Oct 13 15:15:09 2019
New Revision: 353467
URL: https://svnweb.freebsd.org/changeset/base/353467

Log:
  vlan_config() isn't always called in epoch context.
  
  Reported by:	kp

Modified:
  head/sys/net/if_vlan.c

Modified: head/sys/net/if_vlan.c
==============================================================================
--- head/sys/net/if_vlan.c	Sun Oct 13 09:35:03 2019	(r353466)
+++ head/sys/net/if_vlan.c	Sun Oct 13 15:15:09 2019	(r353467)
@@ -1346,12 +1346,11 @@ vlan_lladdr_fn(void *arg, int pending __unused)
 static int
 vlan_config(struct ifvlan *ifv, struct ifnet *p, uint16_t vid)
 {
+	struct epoch_tracker et;
 	struct ifvlantrunk *trunk;
 	struct ifnet *ifp;
 	int error = 0;
 
-	NET_EPOCH_ASSERT();
-
 	/*
 	 * We can handle non-ethernet hardware types as long as
 	 * they handle the tagging and headers themselves.
@@ -1452,7 +1451,9 @@ vlan_config(struct ifvlan *ifv, struct ifnet *p, uint1
 
 	ifp->if_link_state = p->if_link_state;
 
+	NET_EPOCH_ENTER(et);
 	vlan_capabilities(ifv);
+	NET_EPOCH_EXIT(et);
 
 	/*
 	 * Set up our interface address to reflect the underlying
@@ -1794,8 +1795,6 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data
 	struct vlanreq vlr;
 	int error = 0;
 
-	NET_EPOCH_ASSERT();
-
 	ifr = (struct ifreq *)data;
 	ifa = (struct ifaddr *) data;
 	ifv = ifp->if_softc;
@@ -1972,8 +1971,13 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data
 		VLAN_SLOCK();
 		ifv->ifv_capenable = ifr->ifr_reqcap;
 		trunk = TRUNK(ifv);
-		if (trunk != NULL)
+		if (trunk != NULL) {
+			struct epoch_tracker et;
+
+			NET_EPOCH_ENTER(et);
 			vlan_capabilities(ifv);
+			NET_EPOCH_EXIT(et);
+		}
 		VLAN_SUNLOCK();
 		break;
 


More information about the svn-src-all mailing list