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