Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 14 Jun 2020 21:07:12 +0000 (UTC)
From:      Vincenzo Maffione <vmaffione@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r362185 - head/sys/net
Message-ID:  <202006142107.05EL7Cwu049011@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: vmaffione
Date: Sun Jun 14 21:07:12 2020
New Revision: 362185
URL: https://svnweb.freebsd.org/changeset/base/362185

Log:
  iflib: netmap: enter/exit netmap mode after device stops
  
  Avoid possible race conditions by calling nm_set_native_flags()
  and nm_clear_native_flags() only after the device has been
  stopped.
  
  MFC after:	1 week

Modified:
  head/sys/net/iflib.c

Modified: head/sys/net/iflib.c
==============================================================================
--- head/sys/net/iflib.c	Sun Jun 14 20:57:24 2020	(r362184)
+++ head/sys/net/iflib.c	Sun Jun 14 21:07:12 2020	(r362185)
@@ -788,13 +788,19 @@ iflib_netmap_register(struct netmap_adapter *na, int o
 	if (!CTX_IS_VF(ctx))
 		IFDI_CRCSTRIP_SET(ctx, onoff, iflib_crcstrip);
 
-	/* enable or disable flags and callbacks in na and ifp */
+	iflib_stop(ctx);
+
+	/*
+	 * Enable (or disable) netmap flags, and intercept (or restore)
+	 * ifp->if_transmit. This is done once the device has been stopped
+	 * to prevent race conditions.
+	 */
 	if (onoff) {
 		nm_set_native_flags(na);
 	} else {
 		nm_clear_native_flags(na);
 	}
-	iflib_stop(ctx);
+
 	iflib_init_locked(ctx);
 	IFDI_CRCSTRIP_SET(ctx, onoff, iflib_crcstrip); // XXX why twice ?
 	status = ifp->if_drv_flags & IFF_DRV_RUNNING ? 0 : 1;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202006142107.05EL7Cwu049011>