svn commit: r357293 - head/sys/net

Hans Petter Selasky hselasky at FreeBSD.org
Thu Jan 30 12:04:03 UTC 2020


Author: hselasky
Date: Thu Jan 30 12:04:02 2020
New Revision: 357293
URL: https://svnweb.freebsd.org/changeset/base/357293

Log:
  Widen EPOCH(9) usage in netisr.
  
  Software interrupt handlers are allowed to sleep. In swi_net() there
  is a read lock behind NETISR_RLOCK() which in turn ends up calling
  msleep() which means the whole of swi_net() cannot be protected by an
  EPOCH(9) section. By default the NETISR_LOCKING feature is disabled.
  
  This issue was introduced by r357004. This is a preparation step for
  replacing the functionality provided by r357004.
  
  Found by:	kib@
  Sponsored by:	Mellanox Technologies

Modified:
  head/sys/net/netisr.c

Modified: head/sys/net/netisr.c
==============================================================================
--- head/sys/net/netisr.c	Thu Jan 30 10:40:38 2020	(r357292)
+++ head/sys/net/netisr.c	Thu Jan 30 12:04:02 2020	(r357293)
@@ -920,6 +920,7 @@ netisr_process_workstream_proto(struct netisr_workstre
 static void
 swi_net(void *arg)
 {
+	struct epoch_tracker et;
 #ifdef NETISR_LOCKING
 	struct rm_priotracker tracker;
 #endif
@@ -931,7 +932,9 @@ swi_net(void *arg)
 #ifdef DEVICE_POLLING
 	KASSERT(nws_count == 1,
 	    ("%s: device_polling but nws_count != 1", __func__));
+	NET_EPOCH_ENTER(et);
 	netisr_poll();
+	NET_EPOCH_EXIT(et);
 #endif
 #ifdef NETISR_LOCKING
 	NETISR_RLOCK(&tracker);
@@ -940,6 +943,7 @@ swi_net(void *arg)
 	KASSERT(!(nwsp->nws_flags & NWS_RUNNING), ("swi_net: running"));
 	if (nwsp->nws_flags & NWS_DISPATCHING)
 		goto out;
+	NET_EPOCH_ENTER(et);
 	nwsp->nws_flags |= NWS_RUNNING;
 	nwsp->nws_flags &= ~NWS_SCHEDULED;
 	while ((bits = nwsp->nws_pendingbits) != 0) {
@@ -950,6 +954,7 @@ swi_net(void *arg)
 		}
 	}
 	nwsp->nws_flags &= ~NWS_RUNNING;
+	NET_EPOCH_EXIT(et);
 out:
 	NWS_UNLOCK(nwsp);
 #ifdef NETISR_LOCKING


More information about the svn-src-all mailing list