svn commit: r193212 - projects/pnet/sys/net

Robert Watson rwatson at FreeBSD.org
Mon Jun 1 09:03:56 UTC 2009


Author: rwatson
Date: Mon Jun  1 09:03:55 2009
New Revision: 193212
URL: http://svn.freebsd.org/changeset/base/193212

Log:
  Add missing VNET setup in the deferred dispatch case.
  
  Lock around stats updates in forced direct dispatch mode.

Modified:
  projects/pnet/sys/net/netisr.c

Modified: projects/pnet/sys/net/netisr.c
==============================================================================
--- projects/pnet/sys/net/netisr.c	Mon Jun  1 08:50:56 2009	(r193211)
+++ projects/pnet/sys/net/netisr.c	Mon Jun  1 09:03:55 2009	(r193212)
@@ -77,6 +77,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/socket.h>
 #include <sys/sysctl.h>
 #include <sys/systm.h>
+#include <sys/vimage.h>
 
 #ifdef DDB
 #include <ddb/ddb.h>
@@ -697,7 +698,10 @@ netisr_process_workstream_proto(struct n
 		if (local_npw.nw_head == NULL)
 			local_npw.nw_tail = NULL;
 		local_npw.nw_len--;
+		VNET_ASSERT(m->m_pkthdr.rcvif != NULL);
+		CURVNET_SET(m->m_pkthdr.rcvif->if_vnet);
 		np[proto].np_handler(m);
+		CURVNET_RESTORE();
 	}
 	KASSERT(local_npw.nw_len == 0,
 	    ("%s(%u): len %u", __func__, proto, local_npw.nw_len));
@@ -882,13 +886,17 @@ netisr_dispatch_src(u_int proto, uintptr
 	/*
 	 * If direct dispatch is forced, then unconditionally dispatch
 	 * without a formal CPU selection.  Borrow the current CPU's stats,
-	 * even if there's no worker on it.
+	 * even if there's no worker on it.  In this case we don't update
+	 * nws_flags because all netisr processing will be source ordered due
+	 * to always being forced to directly dispatch.
 	 */
 	if (netisr_direct_force) {
 		nwsp = &nws[curcpu];
 		npwp = &nwsp->nws_work[proto];
+		NWS_LOCK(nwsp);
 		npwp->nw_dispatched++;
 		npwp->nw_handled++;
+		NWS_UNLOCK(nwsp);
 		np[proto].np_handler(m);
 		error = 0;
 		goto out_unlock;


More information about the svn-src-projects mailing list