svn commit: r361055 - stable/11/sys/net

Eric Joyner erj at FreeBSD.org
Thu May 14 20:07:03 UTC 2020


Author: erj
Date: Thu May 14 20:07:02 2020
New Revision: 361055
URL: https://svnweb.freebsd.org/changeset/base/361055

Log:
  MFC r360398: iflib: Stop interface before (un)registering VLAN
  
  This is now misleadingly named for stable/11; this was meant to fix an
  issue in an out-of-tree iavf(4) driver that uses iflib.
  
  This commit actually introduces a new driver-dependent function that
  iflib-using drivers can implement in order to tell iflib whether an
  interface restart is needed for certain events. For this commit, this
  function is only used for VLAN register/unregister events.
  
  Sponsored by:	Intel Corporation

Modified:
  stable/11/sys/net/ifdi_if.m
  stable/11/sys/net/iflib.c
  stable/11/sys/net/iflib.h
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/net/ifdi_if.m
==============================================================================
--- stable/11/sys/net/ifdi_if.m	Thu May 14 19:57:52 2020	(r361054)
+++ stable/11/sys/net/ifdi_if.m	Thu May 14 20:07:02 2020	(r361055)
@@ -111,6 +111,12 @@ CODE {
 	{
 		return (ENOTSUP);
 	}
+
+	static bool
+	null_needs_restart(if_ctx_t _ctx __unused, enum iflib_restart_event _event __unused)
+	{
+		return (true);
+	}
 };
 
 #
@@ -341,3 +347,8 @@ METHOD int sysctl_int_delay {
 METHOD void debug {
 	if_ctx_t _ctx;
 } DEFAULT null_void_op;
+
+METHOD bool needs_restart {
+	if_ctx_t _ctx;
+	enum iflib_restart_event _event;
+} DEFAULT null_needs_restart;

Modified: stable/11/sys/net/iflib.c
==============================================================================
--- stable/11/sys/net/iflib.c	Thu May 14 19:57:52 2020	(r361054)
+++ stable/11/sys/net/iflib.c	Thu May 14 20:07:02 2020	(r361055)
@@ -4159,10 +4159,13 @@ iflib_vlan_register(void *arg, if_t ifp, uint16_t vtag
 		return;
 
 	CTX_LOCK(ctx);
+	/* Driver may need all untagged packets to be flushed */
+	if (IFDI_NEEDS_RESTART(ctx, IFLIB_RESTART_VLAN_CONFIG))
+		iflib_stop(ctx);
 	IFDI_VLAN_REGISTER(ctx, vtag);
-	/* Re-init to load the changes */
-	if (if_getcapenable(ifp) & IFCAP_VLAN_HWFILTER)
-		iflib_if_init_locked(ctx);
+	/* Re-init to load the changes, if required */
+	if (IFDI_NEEDS_RESTART(ctx, IFLIB_RESTART_VLAN_CONFIG))
+		iflib_init_locked(ctx);
 	CTX_UNLOCK(ctx);
 }
 
@@ -4178,10 +4181,13 @@ iflib_vlan_unregister(void *arg, if_t ifp, uint16_t vt
 		return;
 
 	CTX_LOCK(ctx);
+	/* Driver may need all tagged packets to be flushed */
+	if (IFDI_NEEDS_RESTART(ctx, IFLIB_RESTART_VLAN_CONFIG))
+		iflib_stop(ctx);
 	IFDI_VLAN_UNREGISTER(ctx, vtag);
-	/* Re-init to load the changes */
-	if (if_getcapenable(ifp) & IFCAP_VLAN_HWFILTER)
-		iflib_if_init_locked(ctx);
+	/* Re-init to load the changes, if required */
+	if (IFDI_NEEDS_RESTART(ctx, IFLIB_RESTART_VLAN_CONFIG))
+		iflib_init_locked(ctx);
 	CTX_UNLOCK(ctx);
 }
 

Modified: stable/11/sys/net/iflib.h
==============================================================================
--- stable/11/sys/net/iflib.h	Thu May 14 19:57:52 2020	(r361054)
+++ stable/11/sys/net/iflib.h	Thu May 14 20:07:02 2020	(r361055)
@@ -328,6 +328,15 @@ typedef enum {
 
 
 /*
+ * These enum values are used in iflib_needs_restart to indicate to iflib
+ * functions whether or not the interface needs restarting when certain events
+ * happen.
+ */
+enum iflib_restart_event {
+	IFLIB_RESTART_VLAN_CONFIG,
+};
+
+/*
  * field accessors
  */
 void *iflib_get_softc(if_ctx_t ctx);


More information about the svn-src-all mailing list