PERFORCE change 166272 for review

Andre Oppermann andre at FreeBSD.org
Sun Jul 19 16:27:29 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=166272

Change 166272 by andre at andre_flirtbox on 2009/07/19 16:27:18

	IFC.

Affected files ...

.. //depot/projects/tcp_reass/kern/kern_vimage.c#7 integrate
.. //depot/projects/tcp_reass/net/if.c#10 integrate
.. //depot/projects/tcp_reass/netgraph/ng_gif.c#6 integrate
.. //depot/projects/tcp_reass/netinet/igmp.c#8 integrate
.. //depot/projects/tcp_reass/netinet/in_pcb.c#10 integrate
.. //depot/projects/tcp_reass/netinet/in_rmx.c#9 integrate
.. //depot/projects/tcp_reass/netinet/ip_input.c#9 integrate
.. //depot/projects/tcp_reass/netinet/tcp_subr.c#13 integrate
.. //depot/projects/tcp_reass/netinet/tcp_timer.c#9 integrate
.. //depot/projects/tcp_reass/netinet6/frag6.c#8 integrate
.. //depot/projects/tcp_reass/netinet6/mld6.c#8 integrate
.. //depot/projects/tcp_reass/netipsec/key.c#10 integrate
.. //depot/projects/tcp_reass/sys/kernel.h#7 integrate
.. //depot/projects/tcp_reass/sys/vimage.h#7 integrate

Differences ...

==== //depot/projects/tcp_reass/kern/kern_vimage.c#7 (text+ko) ====

@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_vimage.c,v 1.14 2009/07/17 14:48:21 jamie Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_vimage.c,v 1.15 2009/07/19 14:20:53 rwatson Exp $");
 
 #include "opt_ddb.h"
 
@@ -58,23 +58,22 @@
 static int vnet_mod_constructor(struct vnet_modlink *);
 static int vnet_mod_destructor(struct vnet_modlink *);
 
-#define	VNET_LIST_WLOCK()						\
-	mtx_lock(&vnet_list_refc_mtx);					\
-	while (vnet_list_refc != 0)					\
-		cv_wait(&vnet_list_condvar, &vnet_list_refc_mtx);
+struct rwlock		vnet_rwlock;
+struct sx		vnet_sxlock;
+
+#define	VNET_LIST_WLOCK() do {						\
+	sx_xlock(&vnet_sxlock);						\
+	rw_wlock(&vnet_rwlock);						\
+} while (0)
 
-#define	VNET_LIST_WUNLOCK()						\
-	mtx_unlock(&vnet_list_refc_mtx);
+#define	VNET_LIST_WUNLOCK() do {					\
+	rw_wunlock(&vnet_rwlock);					\
+	sx_xunlock(&vnet_sxlock);					\
+} while (0)
 
 struct vnet_list_head vnet_head;
-
-struct cv vnet_list_condvar;
-struct mtx vnet_list_refc_mtx;
-int vnet_list_refc = 0;
-
 struct vnet *vnet0;
 
-
 /*
  * Move an ifnet to or from another vnet, specified by the jail id.
  */
@@ -373,17 +372,23 @@
 }
 
 static void
-vi_init(void *unused)
+vnet_init_prelink(void *arg)
+{
+
+	rw_init(&vnet_rwlock, "vnet_rwlock");
+	sx_init(&vnet_sxlock, "vnet_sxlock");
+	LIST_INIT(&vnet_head);
+}
+SYSINIT(vnet_init_prelink, SI_SUB_VNET_PRELINK, SI_ORDER_FIRST,
+    vnet_init_prelink, NULL);
+
+static void
+vnet0_init(void *arg)
 {
 
 	TAILQ_INIT(&vnet_modlink_head);
 	TAILQ_INIT(&vnet_modpending_head);
 
-	LIST_INIT(&vnet_head);
-
-	mtx_init(&vnet_list_refc_mtx, "vnet_list_refc_mtx", NULL, MTX_DEF);
-	cv_init(&vnet_list_condvar, "vnet_list_condvar");
-
 	/*
 	 * We MUST clear curvnet in vi_init_done() before going SMP,
 	 * otherwise CURVNET_SET() macros would scream about unnecessary
@@ -391,9 +396,10 @@
 	 */
 	curvnet = prison0.pr_vnet = vnet0 = vnet_alloc();
 }
+SYSINIT(vnet0_init, SI_SUB_VNET, SI_ORDER_FIRST, vnet0_init, NULL);
 
 static void
-vi_init_done(void *unused)
+vnet_init_done(void *unused)
 {
 	struct vnet_modlink *vml_iter;
 
@@ -411,8 +417,8 @@
 	panic("going nowhere without my vnet modules!");
 }
 
-SYSINIT(vimage, SI_SUB_VIMAGE, SI_ORDER_FIRST, vi_init, NULL);
-SYSINIT(vimage_done, SI_SUB_VIMAGE_DONE, SI_ORDER_FIRST, vi_init_done, NULL);
+SYSINIT(vnet_init_done, SI_SUB_VNET_DONE, SI_ORDER_FIRST, vnet_init_done,
+    NULL);
 
 #ifdef DDB
 DB_SHOW_COMMAND(vnets, db_show_vnets)

==== //depot/projects/tcp_reass/net/if.c#10 (text+ko) ====

@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)if.c	8.5 (Berkeley) 1/9/95
- * $FreeBSD: src/sys/net/if.c,v 1.354 2009/07/17 14:48:21 jamie Exp $
+ * $FreeBSD: src/sys/net/if.c,v 1.355 2009/07/19 14:20:53 rwatson Exp $
  */
 
 #include "opt_compat.h"
@@ -1793,8 +1793,8 @@
 	struct ifnet *ifp;
 	int s = splimp();
 
+	VNET_LIST_RLOCK_NOSLEEP();
 	IFNET_RLOCK();
-	VNET_LIST_RLOCK();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 		TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
@@ -1805,8 +1805,8 @@
 		}
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
 	IFNET_RUNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 	splx(s);
 	timeout(if_slowtimo, (void *)0, hz / IFNET_SLOWHZ);
 }

==== //depot/projects/tcp_reass/netgraph/ng_gif.c#6 (text+ko) ====

@@ -62,7 +62,7 @@
  * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
  * OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/netgraph/ng_gif.c,v 1.26 2009/07/14 22:48:30 rwatson Exp $
+ * $FreeBSD: src/sys/netgraph/ng_gif.c,v 1.27 2009/07/19 14:20:53 rwatson Exp $
  */
 
 /*
@@ -561,8 +561,8 @@
 		ng_gif_input_orphan_p = ng_gif_input_orphan;
 
 		/* Create nodes for any already-existing gif interfaces */
+		VNET_LIST_RLOCK_NOSLEEP();
 		IFNET_RLOCK();
-		VNET_LIST_RLOCK();
 		VNET_FOREACH(vnet_iter) {
 			CURVNET_SET_QUIET(vnet_iter); /* XXX revisit quiet */
 			TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
@@ -571,8 +571,8 @@
 			}
 			CURVNET_RESTORE();
 		}
-		VNET_LIST_RUNLOCK();
 		IFNET_RUNLOCK();
+		VNET_LIST_RUNLOCK_NOSLEEP();
 		break;
 
 	case MOD_UNLOAD:

==== //depot/projects/tcp_reass/netinet/igmp.c#8 (text+ko) ====

@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/igmp.c,v 1.85 2009/07/16 21:13:04 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/igmp.c,v 1.86 2009/07/19 14:20:53 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1616,13 +1616,13 @@
 {
 	VNET_ITERATOR_DECL(vnet_iter);
 
-	VNET_LIST_RLOCK();
+	VNET_LIST_RLOCK_NOSLEEP();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 		igmp_fasttimo_vnet();
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 }
 
 /*
@@ -2159,13 +2159,13 @@
 {
 	VNET_ITERATOR_DECL(vnet_iter);
 
-	VNET_LIST_RLOCK();
+	VNET_LIST_RLOCK_NOSLEEP();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 		igmp_slowtimo_vnet();
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 }
 
 /*

==== //depot/projects/tcp_reass/netinet/in_pcb.c#10 (text+ko) ====

@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/in_pcb.c,v 1.258 2009/07/16 21:13:04 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/in_pcb.c,v 1.259 2009/07/19 14:20:53 rwatson Exp $");
 
 #include "opt_ddb.h"
 #include "opt_ipsec.h"
@@ -1570,7 +1570,7 @@
 {
 	VNET_ITERATOR_DECL(vnet_iter);
 
-	VNET_LIST_RLOCK();
+	VNET_LIST_RLOCK_NOSLEEP();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);	/* XXX appease INVARIANTS here */
 		if (V_ipport_tcpallocs <=
@@ -1582,7 +1582,7 @@
 		V_ipport_tcplastcount = V_ipport_tcpallocs;
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 	callout_reset(&ipport_tick_callout, hz, ipport_tick, NULL);
 }
 

==== //depot/projects/tcp_reass/netinet/in_rmx.c#9 (text+ko) ====

@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/in_rmx.c,v 1.77 2009/07/16 21:13:04 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/in_rmx.c,v 1.78 2009/07/19 14:20:53 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -319,7 +319,7 @@
 	struct rtqk_arg arg;
 	int 	fibnum;
 
-	VNET_LIST_RLOCK();
+	VNET_LIST_RLOCK_NOSLEEP();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 
@@ -336,7 +336,7 @@
 		}
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 }
 
 static int _in_rt_was_here;

==== //depot/projects/tcp_reass/netinet/ip_input.c#9 (text+ko) ====

@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/ip_input.c,v 1.370 2009/07/16 21:13:04 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/ip_input.c,v 1.371 2009/07/19 14:20:53 rwatson Exp $");
 
 #include "opt_bootp.h"
 #include "opt_ipfw.h"
@@ -1193,8 +1193,8 @@
 	struct ipq *fp;
 	int i;
 
+	VNET_LIST_RLOCK_NOSLEEP();
 	IPQ_LOCK();
-	VNET_LIST_RLOCK();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 		for (i = 0; i < IPREASS_NHASH; i++) {
@@ -1228,8 +1228,8 @@
 		}
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
 	IPQ_UNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 }
 
 /*
@@ -1241,8 +1241,8 @@
 	VNET_ITERATOR_DECL(vnet_iter);
 	int     i;
 
+	VNET_LIST_RLOCK_NOSLEEP();
 	IPQ_LOCK();
-	VNET_LIST_RLOCK();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 		for (i = 0; i < IPREASS_NHASH; i++) {
@@ -1254,8 +1254,8 @@
 		}
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
 	IPQ_UNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 	in_rtqdrain();
 }
 

==== //depot/projects/tcp_reass/netinet/tcp_subr.c#13 (text+ko) ====

@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/tcp_subr.c,v 1.347 2009/07/16 21:13:04 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/tcp_subr.c,v 1.348 2009/07/19 14:20:53 rwatson Exp $");
 
 #include "opt_compat.h"
 #include "opt_inet.h"
@@ -938,7 +938,7 @@
 	if (!do_tcpdrain)
 		return;
 
-	VNET_LIST_RLOCK();
+	VNET_LIST_RLOCK_NOSLEEP();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 		struct inpcb *inpb;
@@ -964,7 +964,7 @@
 		INP_INFO_RUNLOCK(&V_tcbinfo);
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 }
 
 /*
@@ -1564,7 +1564,7 @@
 	VNET_ITERATOR_DECL(vnet_iter);
 	u_int32_t projected_offset;
 
-	VNET_LIST_RLOCK();
+	VNET_LIST_RLOCK_NOSLEEP();
 	ISN_LOCK();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter); /* XXX appease INVARIANTS */
@@ -1578,7 +1578,7 @@
 		CURVNET_RESTORE();
 	}
 	ISN_UNLOCK();
-	VNET_LIST_RUNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 	callout_reset(&isn_callout, hz/100, tcp_isn_tick, NULL);
 }
 

==== //depot/projects/tcp_reass/netinet/tcp_timer.c#9 (text+ko) ====

@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/tcp_timer.c,v 1.110 2009/07/14 22:48:30 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/tcp_timer.c,v 1.111 2009/07/19 14:20:53 rwatson Exp $");
 
 #include "opt_inet6.h"
 #include "opt_tcpdebug.h"
@@ -127,7 +127,7 @@
 {
 	VNET_ITERATOR_DECL(vnet_iter);
 
-	VNET_LIST_RLOCK();
+	VNET_LIST_RLOCK_NOSLEEP();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 		tcp_maxidle = tcp_keepcnt * tcp_keepintvl;
@@ -136,7 +136,7 @@
 		INP_INFO_WUNLOCK(&V_tcbinfo);
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 }
 
 int	tcp_syn_backoff[TCP_MAXRXTSHIFT + 1] =

==== //depot/projects/tcp_reass/netinet6/frag6.c#8 (text+ko) ====

@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet6/frag6.c,v 1.48 2009/07/16 21:13:04 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet6/frag6.c,v 1.49 2009/07/19 14:20:53 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -720,8 +720,8 @@
 	VNET_ITERATOR_DECL(vnet_iter);
 	struct ip6q *q6;
 
+	VNET_LIST_RLOCK_NOSLEEP();
 	IP6Q_LOCK();
-	VNET_LIST_RLOCK();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 		q6 = V_ip6q.ip6q_next;
@@ -748,8 +748,8 @@
 		}
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
 	IP6Q_UNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 }
 
 /*
@@ -760,9 +760,11 @@
 {
 	VNET_ITERATOR_DECL(vnet_iter);
 
-	if (IP6Q_TRYLOCK() == 0)
+	VNET_LIST_RLOCK_NOSLEEP();
+	if (IP6Q_TRYLOCK() == 0) {
+		VNET_LIST_RUNLOCK_NOSLEEP();
 		return;
-	VNET_LIST_RLOCK();
+	}
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 		while (V_ip6q.ip6q_next != &V_ip6q) {
@@ -772,6 +774,6 @@
 		}
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
 	IP6Q_UNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 }

==== //depot/projects/tcp_reass/netinet6/mld6.c#8 (text+ko) ====

@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet6/mld6.c,v 1.53 2009/07/16 21:13:04 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet6/mld6.c,v 1.54 2009/07/19 14:20:53 rwatson Exp $");
 
 #include "opt_inet.h"
 #include "opt_inet6.h"
@@ -1306,13 +1306,13 @@
 {
 	VNET_ITERATOR_DECL(vnet_iter);
 
-	VNET_LIST_RLOCK();
+	VNET_LIST_RLOCK_NOSLEEP();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 		mld_fasttimo_vnet();
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 }
 
 /*
@@ -1721,13 +1721,13 @@
 {
 	VNET_ITERATOR_DECL(vnet_iter);
 
-	VNET_LIST_RLOCK();
+	VNET_LIST_RLOCK_NOSLEEP();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 		mld_slowtimo_vnet();
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 }
 
 /*

==== //depot/projects/tcp_reass/netipsec/key.c#10 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netipsec/key.c,v 1.60 2009/07/16 21:13:04 rwatson Exp $	*/
+/*	$FreeBSD: src/sys/netipsec/key.c,v 1.61 2009/07/19 14:20:53 rwatson Exp $	*/
 /*	$KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $	*/
 
 /*-
@@ -4537,7 +4537,7 @@
 	VNET_ITERATOR_DECL(vnet_iter);
 	time_t now = time_second;
 
-	VNET_LIST_RLOCK();
+	VNET_LIST_RLOCK_NOSLEEP();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 		key_flush_spd(now);
@@ -4546,7 +4546,7 @@
 		key_flush_spacq(now);
 		CURVNET_RESTORE();
 	}
-	VNET_LIST_RUNLOCK();
+	VNET_LIST_RUNLOCK_NOSLEEP();
 
 #ifndef IPSEC_DEBUG2
 	/* do exchange to tick time !! */

==== //depot/projects/tcp_reass/sys/kernel.h#7 (text+ko) ====

@@ -39,7 +39,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)kernel.h	8.3 (Berkeley) 1/21/94
- * $FreeBSD: src/sys/sys/kernel.h,v 1.148 2009/05/29 21:27:12 jamie Exp $
+ * $FreeBSD: src/sys/sys/kernel.h,v 1.149 2009/07/19 14:20:53 rwatson Exp $
  */
 
 #ifndef _SYS_KERNEL_H_
@@ -106,13 +106,14 @@
 	SI_SUB_MTX_POOL_DYNAMIC	= 0x1AC0000,	/* dynamic mutex pool */
 	SI_SUB_LOCK		= 0x1B00000,	/* various locks */
 	SI_SUB_EVENTHANDLER	= 0x1C00000,	/* eventhandler init */
+	SI_SUB_VNET_PRELINK	= 0x1E00000,	/* vnet init before modules */
 	SI_SUB_KLD		= 0x2000000,	/* KLD and module setup */
 	SI_SUB_CPU		= 0x2100000,	/* CPU resource(s)*/
 	SI_SUB_KDTRACE		= 0x2140000,	/* Kernel dtrace hooks */
 	SI_SUB_MAC		= 0x2180000,	/* TrustedBSD MAC subsystem */
 	SI_SUB_MAC_POLICY	= 0x21C0000,	/* TrustedBSD MAC policies */
 	SI_SUB_MAC_LATE		= 0x21D0000,	/* TrustedBSD MAC subsystem */
-	SI_SUB_VIMAGE		= 0x21E0000,	/* vimage infrastructure */
+	SI_SUB_VNET		= 0x21E0000,	/* vnet 0 */
 	SI_SUB_INTRINSIC	= 0x2200000,	/* proc 0*/
 	SI_SUB_VM_CONF		= 0x2300000,	/* config VM, set limits*/
 	SI_SUB_DDB_SERVICES	= 0x2380000,	/* capture, scripting, etc. */
@@ -158,7 +159,7 @@
 	SI_SUB_SWAP		= 0xc000000,	/* swap */
 	SI_SUB_INTRINSIC_POST	= 0xd000000,	/* proc 0 cleanup*/
 	SI_SUB_SYSCALLS		= 0xd800000,	/* register system calls */
-	SI_SUB_VIMAGE_DONE	= 0xdc00000,	/* vnet registration complete */
+	SI_SUB_VNET_DONE	= 0xdc00000,	/* vnet registration complete */
 	SI_SUB_KTHREAD_INIT	= 0xe000000,	/* init process*/
 	SI_SUB_KTHREAD_PAGE	= 0xe400000,	/* pageout daemon*/
 	SI_SUB_KTHREAD_VM	= 0xe800000,	/* vm daemon*/

==== //depot/projects/tcp_reass/sys/vimage.h#7 (text+ko) ====

@@ -27,17 +27,38 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/sys/vimage.h,v 1.39 2009/07/17 14:48:21 jamie Exp $
+ * $FreeBSD: src/sys/sys/vimage.h,v 1.41 2009/07/19 15:21:42 rwatson Exp $
  */
 
 #ifndef	_SYS_VIMAGE_H_
 #define	_SYS_VIMAGE_H_
 
-#include <sys/proc.h>
+/*
+ * struct vnet describes a virtualized network stack, and is primarily a
+ * pointer to storage for virtualized global variables.  Expose to userspace
+ * as required for libkvm.
+ */
+#if defined(_KERNEL) || defined(_WANT_VNET)
 #include <sys/queue.h>
 
+struct vnet {
+	LIST_ENTRY(vnet)	 vnet_le;	/* all vnets list */
+	u_int			 vnet_magic_n;
+	u_int			 ifcnt;
+	u_int			 sockcnt;
+	void			*vnet_data_mem;
+	uintptr_t		 vnet_data_base;
+};
+
+#define	VNET_MAGIC_N 0x3e0d8f29
+#endif
+
 #ifdef _KERNEL
 
+#include <sys/lock.h>
+#include <sys/sx.h>
+#include <sys/proc.h>
+
 #ifdef INVARIANTS
 #define	VNET_DEBUG
 #endif
@@ -112,19 +133,8 @@
 
 #endif /* VIMAGE */
 
-struct vnet {
-	LIST_ENTRY(vnet)	 vnet_le;	/* all vnets list */
-	u_int			 vnet_magic_n;
-	u_int			 ifcnt;
-	u_int			 sockcnt;
-	void			*vnet_data_mem;
-	uintptr_t		 vnet_data_base;
-};
-
 #define	curvnet curthread->td_vnet
 
-#define	VNET_MAGIC_N 0x3e0d8f29
-
 #ifdef VIMAGE
 #ifdef VNET_DEBUG
 #define	VNET_ASSERT(condition)						\
@@ -176,17 +186,42 @@
 #endif /* !VIMAGE */
 
 #ifdef VIMAGE
+/*
+ * Global linked list of all virtual network stacks, along with read locks to
+ * access it.  If a caller may sleep while accessing the list, it must use
+ * the sleepable lock macros.
+ */
 LIST_HEAD(vnet_list_head, vnet);
 extern struct vnet_list_head vnet_head;
-extern struct vnet *vnet0;
-#define	VNET_ITERATOR_DECL(arg) struct vnet *arg;
-#define	VNET_FOREACH(arg) LIST_FOREACH(arg, &vnet_head, vnet_le)
-#else
+extern struct rwlock vnet_rwlock;
+extern struct sx vnet_sxlock;
+
+#define	VNET_LIST_RLOCK()		sx_slock(&vnet_sxlock)
+#define	VNET_LIST_RLOCK_NOSLEEP()	rw_rlock(&vnet_rwlock)
+#define	VNET_LIST_RUNLOCK()		sx_sunlock(&vnet_sxlock)
+#define	VNET_LIST_RUNLOCK_NOSLEEP()	rw_runlock(&vnet_rwlock)
+
+/*
+ * Iteration macros to walk the global list of virtual network stacks.
+ */
+#define	VNET_ITERATOR_DECL(arg) struct vnet *arg
+#define	VNET_FOREACH(arg)	LIST_FOREACH((arg), &vnet_head, vnet_le)
+
+#else /* !VIMAGE */
+/*
+ * No-op macros for the !VIMAGE case.
+ */
+#define	VNET_LIST_RLOCK()
+#define	VNET_LIST_RLOCK_NOSLEEP()
+#define	VNET_LIST_RUNLOCK()
+#define	VNET_LIST_RUNLOCK_NOSLEEP()
 #define	VNET_ITERATOR_DECL(arg)
 #define	VNET_FOREACH(arg)
-#endif
+
+#endif /* VIMAGE */
 
 #ifdef VIMAGE
+extern struct vnet *vnet0;
 #define	IS_DEFAULT_VNET(arg)	((arg) == vnet0)
 #else
 #define	IS_DEFAULT_VNET(arg)	1
@@ -202,10 +237,6 @@
 #define	P_TO_VNET(p)		NULL
 #endif /* VIMAGE */
 
-/* Non-VIMAGE null-macros */
-#define	VNET_LIST_RLOCK()
-#define	VNET_LIST_RUNLOCK()
-
 #endif /* _KERNEL */
 
 #endif /* !_SYS_VIMAGE_H_ */


More information about the p4-projects mailing list