Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 9 Jan 2021 21:02:06 GMT
From:      Vincenzo Maffione <vmaffione@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 1d238b07d5d4 - main - netmap: iflib: stop krings during interface reset
Message-ID:  <202101092102.109L26Fu017631@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by vmaffione:

URL: https://cgit.FreeBSD.org/src/commit/?id=1d238b07d5d4d9660ae0e08daede6da7e91c7853

commit 1d238b07d5d4d9660ae0e08daede6da7e91c7853
Author:     Vincenzo Maffione <vmaffione@FreeBSD.org>
AuthorDate: 2021-01-09 20:54:11 +0000
Commit:     Vincenzo Maffione <vmaffione@FreeBSD.org>
CommitDate: 2021-01-09 21:01:46 +0000

    netmap: iflib: stop krings during interface reset
    
    When different processes open separate subsets of the
    available rings of a same netmap interface, a device
    reset may be performed while one of the processes
    is actively using some rings (e.g., caused by another
    process executing a nmport_open()).
    With this patch, such situation will cause the
    active process to get a POLLERR, so that it can
    have a chance to detect the situation.
    We also guarantee that no process is running a txsync
    or rxsync (ioctl or poll) while an iflib device reset
    is in progress.
    
    PR:         252453
    MFC after:  1 week
---
 sys/dev/netmap/netmap.c | 2 +-
 sys/net/iflib.c         | 9 +++++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/sys/dev/netmap/netmap.c b/sys/dev/netmap/netmap.c
index d2c0f8f1c5c4..aa3bb1843ba5 100644
--- a/sys/dev/netmap/netmap.c
+++ b/sys/dev/netmap/netmap.c
@@ -4236,7 +4236,7 @@ nm_set_native_flags(struct netmap_adapter *na)
 	struct ifnet *ifp = na->ifp;
 
 	/* We do the setup for intercepting packets only if we are the
-	 * first user of this adapapter. */
+	 * first user of this adapter. */
 	if (na->active_fds > 0) {
 		return;
 	}
diff --git a/sys/net/iflib.c b/sys/net/iflib.c
index cc401a5db24d..1b86fd670ac4 100644
--- a/sys/net/iflib.c
+++ b/sys/net/iflib.c
@@ -809,6 +809,13 @@ iflib_netmap_register(struct netmap_adapter *na, int onoff)
 	if (!CTX_IS_VF(ctx))
 		IFDI_CRCSTRIP_SET(ctx, onoff, iflib_crcstrip);
 
+	/*
+	 * Stop any pending txsync/rxsync and prevent new ones
+	 * form starting. Processes blocked in poll() will get
+	 * POLLERR.
+	 */
+	netmap_disable_all_rings(ifp);
+
 	iflib_stop(ctx);
 
 	/*
@@ -828,6 +835,8 @@ iflib_netmap_register(struct netmap_adapter *na, int onoff)
 	if (status)
 		nm_clear_native_flags(na);
 	CTX_UNLOCK(ctx);
+        /* Re-enable txsync/rxsync. */
+	netmap_enable_all_rings(ifp);
 	return (status);
 }
 



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