Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 Apr 2009 23:26:00 GMT
From:      Marko Zec <zec@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 160676 for review
Message-ID:  <200904152326.n3FNQ0Li069297@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=160676

Change 160676 by zec@zec_amdx2 on 2009/04/15 23:25:57

	A small step towards allowing for "options VIMAGE" builds
	to compile.

Affected files ...

.. //depot/projects/vimage-commit2/src/sys/kern/kern_vimage.c#15 edit
.. //depot/projects/vimage-commit2/src/sys/net/if_gif.c#22 edit
.. //depot/projects/vimage-commit2/src/sys/net/if_loop.c#24 edit
.. //depot/projects/vimage-commit2/src/sys/net/if_var.h#16 edit
.. //depot/projects/vimage-commit2/src/sys/net/route.c#33 edit
.. //depot/projects/vimage-commit2/src/sys/net/rtsock.c#20 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/igmp.c#24 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/in.c#21 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/in_mcast.c#19 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/in_pcb.h#16 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/in_rmx.c#25 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/tcp_subr.c#46 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/tcp_syncache.h#5 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/tcp_timewait.c#23 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/tcp_var.h#11 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/udp_usrreq.c#33 edit
.. //depot/projects/vimage-commit2/src/sys/netinet6/in6_rmx.c#26 edit
.. //depot/projects/vimage-commit2/src/sys/netinet6/nd6.c#25 edit
.. //depot/projects/vimage-commit2/src/sys/netinet6/nd6_rtr.c#23 edit
.. //depot/projects/vimage-commit2/src/sys/sys/socketvar.h#4 edit
.. //depot/projects/vimage-commit2/src/sys/sys/sysctl.h#17 edit
.. //depot/projects/vimage-commit2/src/sys/sys/vimage.h#38 edit

Differences ...

==== //depot/projects/vimage-commit2/src/sys/kern/kern_vimage.c#15 (text+ko) ====

@@ -42,12 +42,18 @@
 #ifndef VIMAGE_GLOBALS
 
 MALLOC_DEFINE(M_VIMAGE, "vimage", "vimage resource container");
+MALLOC_DEFINE(M_VNET, "vnet", "network stack control block");
 
 static TAILQ_HEAD(vnet_modlink_head, vnet_modlink) vnet_modlink_head;
 static TAILQ_HEAD(vnet_modpending_head, vnet_modlink) vnet_modpending_head;
 static void vnet_mod_complete_registration(struct vnet_modlink *);
 static int vnet_mod_constructor(struct vnet_modlink *);
 
+/* curvnet should be thread-local - this is only a temporary step */
+#ifdef VIMAGE
+struct vnet *curvnet;
+#endif
+
 void
 vnet_mod_register(const struct vnet_modinfo *vmi)
 {
@@ -194,7 +200,13 @@
 		for (mapentry = vml->vml_modinfo->vmi_symmap;
 		    mapentry->name != NULL; mapentry++) {
 			if (strcmp(symstr, mapentry->name) == 0) {
-				lookup->symvalue = (u_long) mapentry->base;
+#ifdef VIMAGE
+				lookup->symvalue =
+				    (u_long) curvnet->mod_data[vml->vml_modinfo->vmi_id];
+				lookup->symvalue += mapentry->offset;
+#else
+				lookup->symvalue = (u_long) mapentry->offset;
+#endif
 				lookup->symsize = mapentry->size;
 				return (0);
 			}
@@ -206,9 +218,21 @@
 static void
 vi_init(void *unused)
 {
+	struct vnet *vnet;
 
 	TAILQ_INIT(&vnet_modlink_head);
 	TAILQ_INIT(&vnet_modpending_head);
+
+#ifdef VIMAGE
+	LIST_INIT(&vnet_head);
+
+	vnet = malloc(sizeof(struct vnet), M_VNET, M_NOWAIT | M_ZERO);
+	if (vnet == NULL)
+		panic("vi_alloc: malloc failed");
+	LIST_INSERT_HEAD(&vnet_head, vnet, vnet_le);
+
+	curvnet = LIST_FIRST(&vnet_head);
+#endif
 }
 
 static void

==== //depot/projects/vimage-commit2/src/sys/net/if_gif.c#22 (text+ko) ====

@@ -303,8 +303,10 @@
 		if_clone_detach(&gif_cloner);
 		mtx_destroy(&gif_mtx);
 #ifdef INET6
+#ifndef VIMAGE
 		V_ip6_gif_hlim = 0;	/* XXX -> vnet_gif_idetach() */
 #endif
+#endif
 		break;
 	default:
 		return EOPNOTSUPP;

==== //depot/projects/vimage-commit2/src/sys/net/if_loop.c#24 (text+ko) ====

@@ -174,7 +174,6 @@
 static int
 loop_modevent(module_t mod, int type, void *data)
 {
-	INIT_VNET_NET(curvnet);
 
 	switch (type) {
 	case MOD_LOAD:

==== //depot/projects/vimage-commit2/src/sys/net/if_var.h#16 (text+ko) ====

@@ -116,6 +116,7 @@
 struct ifnet {
 	void	*if_softc;		/* pointer to driver state */
 	void	*if_l2com;		/* pointer to protocol bits */
+	struct vnet *if_vnet;		/* pointer to vnet */
 	TAILQ_ENTRY(ifnet) if_link; 	/* all struct ifnets are chained */
 	char	if_xname[IFNAMSIZ];	/* external name (name + unit) */
 	const char *if_dname;		/* driver name */

==== //depot/projects/vimage-commit2/src/sys/net/route.c#33 (text+ko) ====

@@ -178,7 +178,7 @@
 
 static int vnet_route_iattach(const void *unused __unused)
 {
-	INIT_VNET_INET(curvnet);
+	INIT_VNET_NET(curvnet);
 	int table;
 	struct domain *dom;
 	int fam;

==== //depot/projects/vimage-commit2/src/sys/net/rtsock.c#20 (text+ko) ====

@@ -1203,7 +1203,6 @@
 static void
 rt_dispatch(struct mbuf *m, const struct sockaddr *sa)
 {
-	INIT_VNET_NET(curvnet);
 	struct m_tag *tag;
 
 	/*

==== //depot/projects/vimage-commit2/src/sys/netinet/igmp.c#24 (text+ko) ====

@@ -141,13 +141,8 @@
 static int	sysctl_igmp_gsr(SYSCTL_HANDLER_ARGS);
 static int	sysctl_igmp_ifinfo(SYSCTL_HANDLER_ARGS);
 
-#ifdef VIMAGE
 static vnet_attach_fn	vnet_igmp_iattach;
 static vnet_detach_fn	vnet_igmp_idetach;
-#else
-static int	vnet_igmp_iattach(const void *);
-static int	vnet_igmp_idetach(const void *);
-#endif /* VIMAGE */
 
 /*
  * System-wide globals.
@@ -340,6 +335,7 @@
 static int
 sysctl_igmp_default_version(SYSCTL_HANDLER_ARGS)
 {
+	INIT_VNET_INET(curvnet);
 	int	 error;
 	int	 new;
 
@@ -379,6 +375,7 @@
 static int
 sysctl_igmp_gsr(SYSCTL_HANDLER_ARGS)
 {
+	INIT_VNET_INET(curvnet);
 	int error;
 	int i;
 
@@ -420,6 +417,7 @@
 sysctl_igmp_ifinfo(SYSCTL_HANDLER_ARGS)
 {
 	INIT_VNET_NET(curvnet);
+	INIT_VNET_INET(curvnet);
 	int			*name;
 	int			 error;
 	u_int			 namelen;
@@ -505,6 +503,7 @@
 static __inline int
 igmp_isgroupreported(const struct in_addr addr)
 {
+	INIT_VNET_INET(curvnet);
 
 	if (in_allhosts(addr) ||
 	    ((!V_igmp_sendlocal && IN_LOCAL_GROUP(ntohl(addr.s_addr)))))
@@ -567,6 +566,7 @@
 static struct igmp_ifinfo *
 igi_alloc_locked(/*const*/ struct ifnet *ifp)
 {
+	INIT_VNET_INET(ifp->if_vnet);
 	struct igmp_ifinfo *igi;
 
 	IGMP_LOCK_ASSERT();
@@ -712,6 +712,7 @@
 static void
 igi_delete_locked(const struct ifnet *ifp)
 {
+	INIT_VNET_INET(ifp->if_vnet);
 	struct igmp_ifinfo *igi, *tigi;
 
 	CTR3(KTR_IGMPV3, "%s: freeing igmp_ifinfo for ifp %p(%s)",
@@ -836,6 +837,7 @@
 igmp_input_v2_query(struct ifnet *ifp, const struct ip *ip,
     const struct igmp *igmp)
 {
+	INIT_VNET_INET(ifp->if_vnet);
 	struct ifmultiaddr	*ifma;
 	struct igmp_ifinfo	*igi;
 	struct in_multi		*inm;
@@ -928,6 +930,7 @@
 static void
 igmp_v2_update_group(struct in_multi *inm, const int timer)
 {
+	INIT_VNET_INET(curvnet);
 
 	CTR4(KTR_IGMPV3, "%s: %s/%s timer=%d", __func__,
 	    inet_ntoa(inm->inm_addr), inm->inm_ifp->if_xname, timer);
@@ -975,6 +978,7 @@
 igmp_input_v3_query(struct ifnet *ifp, const struct ip *ip,
     /*const*/ struct igmpv3 *igmpv3)
 {
+	INIT_VNET_INET(ifp->if_vnet);
 	struct igmp_ifinfo	*igi;
 	struct in_multi		*inm;
 	uint32_t		 maxresp, nsrc, qqi;
@@ -1119,6 +1123,7 @@
 igmp_input_v3_group_query(struct in_multi *inm, struct igmp_ifinfo *igi,
     int timer, /*const*/ struct igmpv3 *igmpv3)
 {
+	INIT_VNET_INET(curvnet);
 	int			 retval;
 	uint16_t		 nsrc;
 
@@ -1221,6 +1226,7 @@
 igmp_input_v1_report(struct ifnet *ifp, /*const*/ struct ip *ip,
     /*const*/ struct igmp *igmp)
 {
+	INIT_VNET_INET(ifp->if_vnet);
 	struct in_ifaddr *ia;
 	struct in_multi *inm;
 
@@ -1327,6 +1333,7 @@
 igmp_input_v2_report(struct ifnet *ifp, /*const*/ struct ip *ip,
     /*const*/ struct igmp *igmp)
 {
+	INIT_VNET_INET(ifp->if_vnet);
 	struct in_ifaddr *ia;
 	struct in_multi *inm;
 
@@ -1612,21 +1619,15 @@
 void
 igmp_fasttimo(void)
 {
-#ifdef VIMAGE
 	VNET_ITERATOR_DECL(vnet_iter);
 
 	VNET_LIST_RLOCK();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
-		INIT_VNET_INET(vnet_iter);
 		igmp_fasttimo_vnet();
 		CURVNET_RESTORE();
 	}
 	VNET_LIST_RUNLOCK();
-#else /* !VIMAGE */
-
-	igmp_fasttimo_vnet();
-#endif /* VIMAGE */
 }
 
 /*
@@ -1638,6 +1639,7 @@
 static void
 igmp_fasttimo_vnet(void)
 {
+	INIT_VNET_INET(curvnet);
 	struct ifqueue		 scq;	/* State-change packets */
 	struct ifqueue		 qrq;	/* Query response packets */
 	struct ifnet		*ifp;
@@ -1765,6 +1767,7 @@
 static void
 igmp_v1v2_process_group_timer(struct in_multi *inm, const int version)
 {
+	INIT_VNET_INET(curvnet);
 	int report_timer_expired;
 
 	IN_MULTI_LOCK_ASSERT();
@@ -1813,6 +1816,7 @@
     struct ifqueue *qrq, struct ifqueue *scq,
     struct in_multi *inm, const int uri_fasthz)
 {
+	INIT_VNET_INET(curvnet);
 	int query_response_timer_expired;
 	int state_change_retransmit_timer_expired;
 
@@ -2002,6 +2006,7 @@
 static void
 igmp_v3_cancel_link_timers(struct igmp_ifinfo *igi)
 {
+	INIT_VNET_INET(curvnet);
 	struct ifmultiaddr	*ifma;
 	struct ifnet		*ifp;
 	struct in_multi		*inm;
@@ -2077,6 +2082,7 @@
 static void
 igmp_v1v2_process_querier_timers(struct igmp_ifinfo *igi)
 {
+	INIT_VNET_INET(curvnet);
 
 	IGMP_LOCK_ASSERT();
 
@@ -2153,20 +2159,15 @@
 void
 igmp_slowtimo(void)
 {
-#ifdef VIMAGE
 	VNET_ITERATOR_DECL(vnet_iter);
 
 	VNET_LIST_RLOCK();
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
-		INIT_VNET_INET(vnet_iter);
 		igmp_slowtimo_vnet();
 		CURVNET_RESTORE();
 	}
 	VNET_LIST_RUNLOCK();
-#else /* !VIMAGE */
-	igmp_slowtimo_vnet();
-#endif /* VIMAGE */
 }
 
 /*
@@ -2175,6 +2176,7 @@
 static void
 igmp_slowtimo_vnet(void)
 {
+	INIT_VNET_INET(curvnet);
 	struct igmp_ifinfo *igi;
 
 	IGMP_LOCK();
@@ -2202,9 +2204,6 @@
 	IGMP_LOCK_ASSERT();
 
 	ifp = inm->inm_ifp;
-	/* XXX are these needed ? */
-	INIT_VNET_NET(ifp->if_vnet);
-	INIT_VNET_INET(ifp->if_vnet);
 
 	MGETHDR(m, M_DONTWAIT, MT_DATA);
 	if (m == NULL)
@@ -2342,6 +2341,7 @@
 static int
 igmp_initial_join(struct in_multi *inm, struct igmp_ifinfo *igi)
 {
+	INIT_VNET_INET(curvnet);
 	struct ifnet		*ifp;
 	struct ifqueue		*ifq;
 	int			 error, retval, syncstates;
@@ -2470,6 +2470,7 @@
 static int
 igmp_handle_state_change(struct in_multi *inm, struct igmp_ifinfo *igi)
 {
+	INIT_VNET_INET(curvnet);
 	struct ifnet		*ifp;
 	int			 retval;
 
@@ -2529,6 +2530,7 @@
 static void
 igmp_final_leave(struct in_multi *inm, struct igmp_ifinfo *igi)
 {
+	INIT_VNET_INET(curvnet);
 	int syncstates;
 
 	syncstates = 1;
@@ -3314,6 +3316,7 @@
 static void
 igmp_v3_dispatch_general_query(struct igmp_ifinfo *igi)
 {
+	INIT_VNET_INET(curvnet);
 	struct ifmultiaddr	*ifma, *tifma;
 	struct ifnet		*ifp;
 	struct in_multi		*inm;
@@ -3395,12 +3398,14 @@
 	CTR2(KTR_IGMPV3, "%s: transmit %p", __func__, m);
 
 	/*
-	 * Restore VNET image pointer from enqueued mbuf chain
+	 * Set VNET image pointer from enqueued mbuf chain
 	 * before doing anything else. Whilst we use interface
 	 * indexes to guard against interface detach, they are
 	 * unique to each VIMAGE and must be retrieved.
 	 */
 	CURVNET_SET(m->m_pkthdr.header);
+	INIT_VNET_NET(curvnet);
+	INIT_VNET_INET(curvnet);
 	ifindex = igmp_restore_context(m);
 
 	/*
@@ -3482,7 +3487,6 @@
 static struct mbuf *
 igmp_v3_encap_report(struct ifnet *ifp, struct mbuf *m)
 {
-	INIT_VNET_NET(curvnet);
 	INIT_VNET_INET(curvnet);
 	struct igmp_report	*igmp;
 	struct ip		*ip;
@@ -3661,15 +3665,28 @@
 	return (0);
 }
 
-#ifdef VIMAGE
+/*
+ * XXX Are igi_head and igmpstat really accessed via kmem / kldsym?
+ * If so, given that they are members of struct vnet_inet, they should
+ * be registered with VNET_MOD_INET, not here.  Revisit!!!
+ */
+#if 0
 static struct vnet_symmap vnet_igmp_symmap[] = {
 	VNET_SYMMAP(igmp, igi_head),
 	VNET_SYMMAP(igmp, igmpstat),
 	VNET_SYMMAP_END
 };
-VNET_MOD_DECLARE(IGMP, igmp, vnet_igmp_iattach, vnet_igmp_idetach,
-    vnet_igmp_symmap);
-#endif /* VIMAGE */
+#endif
+
+#ifndef VIMAGE_GLOBALS
+static vnet_modinfo_t vnet_igmp_modinfo = {
+	.vmi_id		= VNET_MOD_IGMP,
+	.vmi_name	= "igmp",
+	.vmi_dependson	= VNET_MOD_INET,
+	.vmi_iattach	= vnet_igmp_iattach,
+	.vmi_idetach	= vnet_igmp_idetach
+};
+#endif
 
 static int
 igmp_modevent(module_t mod, int type, void *unused __unused)
@@ -3678,22 +3695,20 @@
     switch (type) {
     case MOD_LOAD:
 	igmp_sysinit();
-#ifdef VIMAGE
+#ifndef VIMAGE_GLOBALS
 	vnet_mod_register(&vnet_igmp_modinfo);
 #else
-	(void)vnet_igmp_iattach(NULL);
-#endif /* VIMAGE */
+	vnet_igmp_iattach(NULL);
+#endif
 	break;
     case MOD_UNLOAD:
-#ifdef VIMAGE
-	/*
-	 * TODO: Allow module unload if any VIMAGE instances
-	 * are using this module.
-	 */
-	return (EBUSY);
+#ifndef VIMAGE_GLOBALS
+#ifdef NOTYET
+	vnet_mod_deregister(&vnet_igmp_modinfo);
+#endif
 #else
-	(void)vnet_igmp_idetach(NULL);
-#endif /* VIMAGE */
+	vnet_igmp_idetach(NULL);
+#endif
 	igmp_sysuninit();
 	break;
     default:

==== //depot/projects/vimage-commit2/src/sys/netinet/in.c#21 (text+ko) ====

@@ -1017,7 +1017,6 @@
 static void
 in_purgemaddrs(struct ifnet *ifp)
 {
-	INIT_VNET_INET(ifp->if_vnet);
 	LIST_HEAD(,in_multi) purgeinms;
 	struct in_multi		*inm, *tinm;
 	struct ifmultiaddr	*ifma;

==== //depot/projects/vimage-commit2/src/sys/netinet/in_mcast.c#19 (text+ko) ====

@@ -392,7 +392,6 @@
 in_getmulti(struct ifnet *ifp, const struct in_addr *group,
     struct in_multi **pinm)
 {
-	INIT_VNET_INET(ifp->if_vnet);
 	struct sockaddr_in	 gsin;
 	struct ifmultiaddr	*ifma;
 	struct in_ifinfo	*ii;
@@ -1821,6 +1820,7 @@
 inp_lookup_mcast_ifp(const struct inpcb *inp,
     const struct sockaddr_in *gsin, const struct in_addr ina)
 {
+	INIT_VNET_INET(curvnet);
 	struct ifnet *ifp;
 
 	KASSERT(gsin->sin_family == AF_INET, ("%s: not AF_INET", __func__));
@@ -1866,7 +1866,6 @@
 inp_join_group(struct inpcb *inp, struct sockopt *sopt)
 {
 	INIT_VNET_NET(curvnet);
-	INIT_VNET_INET(curvnet);
 	struct group_source_req		 gsr;
 	sockunion_t			*gsa, *ssa;
 	struct ifnet			*ifp;
@@ -2319,6 +2318,7 @@
 inp_set_multicast_if(struct inpcb *inp, struct sockopt *sopt)
 {
 	INIT_VNET_NET(curvnet);
+	INIT_VNET_INET(curvnet);
 	struct in_addr		 addr;
 	struct ip_mreqn		 mreqn;
 	struct ifnet		*ifp;

==== //depot/projects/vimage-commit2/src/sys/netinet/in_pcb.h#16 (text+ko) ====

@@ -221,6 +221,8 @@
 #define	in6p_icmp6filt	inp_depend6.inp6_icmp6filt
 #define	in6p_cksum	inp_depend6.inp6_cksum
 
+#define	inp_vnet	inp_pcbinfo->ipi_vnet
+
 /*
  * The range of the generation count, as used in this implementation, is 9e19.
  * We would have to create 300 billion connections per second for this number
@@ -298,8 +300,12 @@
 	struct rwlock		 ipi_lock;
 
 	/*
-	 * vimage 1
-	 * general use 1
+	 * Pointer to network stack instance
+	 */
+	struct vnet		*ipi_vnet;
+
+	/*
+	 * general use 2
 	 */
 	void 			*ipi_pspare[2];
 };

==== //depot/projects/vimage-commit2/src/sys/netinet/in_rmx.c#25 (text+ko) ====

@@ -250,6 +250,8 @@
 static void
 in_rtqtimo(void *rock)
 {
+	INIT_VNET_NET(curvnet);		/* XXX revisit!!! */
+	INIT_VNET_INET(curvnet);	/* XXX revisit!!! */
 	int fibnum;
 	void *newrock;
 	struct timeval atv;

==== //depot/projects/vimage-commit2/src/sys/netinet/tcp_subr.c#46 (text+ko) ====

@@ -288,6 +288,7 @@
 static void
 tcp_zone_change(void *tag)
 {
+	INIT_VNET_INET(curvnet);
 
 	uma_zone_set_max(V_tcbinfo.ipi_zone, maxsockets);
 	uma_zone_set_max(V_tcpcb_zone, maxsockets);

==== //depot/projects/vimage-commit2/src/sys/netinet/tcp_syncache.h#5 (text+ko) ====

@@ -96,6 +96,7 @@
 #define	SYNCOOKIE_LIFETIME	16	/* seconds */
 
 struct syncache_head {
+	struct vnet	*sch_vnet;
 	struct mtx	sch_mtx;
 	TAILQ_HEAD(sch_head, syncache)	sch_bucket;
 	struct callout	sch_timer;

==== //depot/projects/vimage-commit2/src/sys/netinet/tcp_timewait.c#23 (text+ko) ====

@@ -132,6 +132,7 @@
 static int
 sysctl_maxtcptw(SYSCTL_HANDLER_ARGS)
 {
+	INIT_VNET_INET(curvnet);
 	int error, new;
 
 	if (maxtcptw == 0)
@@ -158,6 +159,7 @@
 void
 tcp_tw_zone_change(void)
 {
+	INIT_VNET_INET(curvnet);
 
 	if (maxtcptw == 0)
 		uma_zone_set_max(V_tcptw_zone, tcptw_auto_size());

==== //depot/projects/vimage-commit2/src/sys/netinet/tcp_var.h#11 (text+ko) ====

@@ -35,6 +35,8 @@
 
 #include <netinet/tcp.h>
 
+struct vnet;
+
 /*
  * Kernel variables for tcp.
  */
@@ -186,7 +188,8 @@
 	int	t_rttlow;		/* smallest observerved RTT */
 	u_int32_t	rfbuf_ts;	/* recv buffer autoscaling timestamp */
 	int	rfbuf_cnt;		/* recv buffer autoscaling byte count */
-	void	*t_pspare[3];		/* toe usrreqs / toepcb * / congestion algo / vimage / 1 general use */
+	struct vnet *t_vnet;		/* pointer to parent vnet */
+	void	*t_pspare[2];		/* toe usrreqs / toepcb * / congestion algo / vimage / 1 general use */
 	struct toe_usrreqs *t_tu;       /* offload operations vector */
 	void	*t_toe;			/* TOE pcb pointer */
 	int	t_bytes_acked;		/* # bytes acked during current RTT */

==== //depot/projects/vimage-commit2/src/sys/netinet/udp_usrreq.c#33 (text+ko) ====

@@ -155,6 +155,7 @@
 static void
 udp_zone_change(void *tag)
 {
+	INIT_VNET_INET(curvnet);
 
 	uma_zone_set_max(V_udbinfo.ipi_zone, maxsockets);
 }

==== //depot/projects/vimage-commit2/src/sys/netinet6/in6_rmx.c#26 (text+ko) ====

@@ -289,7 +289,6 @@
 in6_rtqtimo(void *rock)
 {
 	CURVNET_SET_QUIET((struct vnet *) rock);
-	INIT_VNET_NET((struct vnet *) rock);
 	INIT_VNET_INET6((struct vnet *) rock);
 	struct radix_node_head *rnh = rock;
 	struct rtqk_arg arg;
@@ -377,7 +376,6 @@
 in6_mtutimo(void *rock)
 {
 	CURVNET_SET_QUIET((struct vnet *) rock);
-	INIT_VNET_NET((struct vnet *) rock);
 	INIT_VNET_INET6((struct vnet *) rock);
 	struct radix_node_head *rnh = rock;
 	struct mtuex_arg arg;

==== //depot/projects/vimage-commit2/src/sys/netinet6/nd6.c#25 (text+ko) ====

@@ -869,7 +869,6 @@
 struct llentry *
 nd6_lookup(struct in6_addr *addr6, int flags, struct ifnet *ifp)
 {
-	INIT_VNET_INET6(curvnet);
 	struct sockaddr_in6 sin6;
 	struct llentry *ln;
 	int llflags = 0;

==== //depot/projects/vimage-commit2/src/sys/netinet6/nd6_rtr.c#23 (text+ko) ====

@@ -1543,6 +1543,7 @@
 int
 nd6_prefix_onlink(struct nd_prefix *pr)
 {
+	INIT_VNET_NET(curvnet);
 	INIT_VNET_INET6(curvnet);
 	struct ifaddr *ifa;
 	struct ifnet *ifp = pr->ndpr_ifp;

==== //depot/projects/vimage-commit2/src/sys/sys/socketvar.h#4 (text+ko) ====

@@ -45,6 +45,8 @@
 #include <sys/sockopt.h>
 #endif
 
+struct vnet;
+
 /*
  * Kernel structure per socket.
  * Contains send and receive buffer queues,
@@ -72,6 +74,7 @@
 	short	so_state;		/* (b) internal state flags SS_* */
 	int	so_qstate;		/* (e) internal state flags SQ_* */
 	void	*so_pcb;		/* protocol control block */
+	struct	vnet *so_vnet;		/* network stack instance */
 	struct	protosw *so_proto;	/* (a) protocol handle */
 /*
  * Variables for connection queuing.

==== //depot/projects/vimage-commit2/src/sys/sys/sysctl.h#17 (text+ko) ====

@@ -163,6 +163,8 @@
 	const char	*oid_fmt;
 	int		oid_refcnt;
 	const char	*oid_descr;
+	short		oid_v_subs;
+	short		oid_v_mod;
 };
 
 #define SYSCTL_IN(r, p, l) (r->newfunc)(r, p, l)

==== //depot/projects/vimage-commit2/src/sys/sys/vimage.h#38 (text+ko) ====

@@ -48,8 +48,8 @@
 
 struct vnet_symmap {
 	char	*name;
-	void	*base;
-	size_t	size;
+	size_t	 offset;
+	size_t	 size;
 };
 typedef struct vnet_symmap vnet_symmap_t;
 
@@ -71,12 +71,6 @@
 	const char			*vml_iname;
 };
 
-#define	VNET_SYMMAP(mod, name)						\
-	{ #name, &(vnet_ ## mod ## _0._ ## name),			\
-	sizeof(vnet_ ## mod ## _0._ ## name) }
-
-#define	VNET_SYMMAP_END		{ NULL, 0 }
-
 /* stateful modules */
 #define	VNET_MOD_NET		 0	/* MUST be 0 - implicit dependency */
 #define	VNET_MOD_NETGRAPH	 1
@@ -108,7 +102,11 @@
 #define	VNET_MOD_DYNAMIC_START	32
 #define	VNET_MOD_MAX		64
 
-/* Sysctl virtualization macros need these name mappings bellow */
+/* Major module IDs for vimage sysctl virtualization */
+#define	V_GLOBAL	0	/* global variable - no indirection */
+#define	V_NET		1
+
+/* Name mappings for minor module IDs in vimage sysctl virtualization */
 #define	V_MOD_vnet_net		VNET_MOD_NET
 #define	V_MOD_vnet_netgraph	VNET_MOD_NETGRAPH
 #define	V_MOD_vnet_inet		VNET_MOD_INET
@@ -128,21 +126,67 @@
 #define	VSYM(base, sym) (sym)
 #else
 #ifdef VIMAGE
-#error "No option VIMAGE yet!"
+#define	VSYM(base, sym) ((base)->_ ## sym)
 #else
 #define	VSYM(base, sym) (base ## _0._ ## sym)
 #endif
 #endif
 
+#ifndef VIMAGE_GLOBALS
+#ifdef VIMAGE
+#define VNET_SYMMAP(mod, name)						\
+	{ #name, offsetof(struct vnet_ ## mod, _ ## name),		\
+	sizeof(((struct vnet_ ## mod *) curthread)->_ ## name) }
+#else
+#define	VNET_SYMMAP(mod, name)						\
+	{ #name, &(vnet_ ## mod ## _0._ ## name),			\
+	sizeof(vnet_ ## mod ## _0._ ## name) }
+#endif
+#define	VNET_SYMMAP_END		{ NULL, 0 }
+#endif /* !VIMAGE_GLOBALS */
+
+#ifdef VIMAGE
+struct vnet {
+	void		*mod_data[VNET_MOD_MAX];
+	LIST_ENTRY(vnet) vnet_le;	/* all vnets list */
+	u_int		 vnet_magic_n;
+};
+
+extern struct vnet *curvnet;
+#endif
+
+#ifdef VIMAGE
+#ifdef VNET_DEBUG
+#define INIT_FROM_VNET(vnet, modindex, modtype, sym)                    \
+        if (vnet != curvnet)                                            \
+                panic("in %s:%d %s()\n vnet=%p curvnet=%p",             \
+                      __FILE__, __LINE__, __FUNCTION__,                 \
+                      vnet, curvnet);                                   \
+        modtype *sym = (vnet)->mod_data[modindex];
+#else /* !VNET_DEBUG */
+#define INIT_FROM_VNET(vnet, modindex, modtype, sym)                    \
+        modtype *sym = (vnet)->mod_data[modindex];
+#endif /* !VNET_DEBUG */
+#else /* !VIMAGE */
+#define	INIT_FROM_VNET(vnet, modindex, modtype, sym)
+#endif
+
+#ifdef VIMAGE
+LIST_HEAD(vnet_list_head, vnet);
+extern struct vnet_list_head vnet_head;
+#define VNET_ITERATOR_DECL(arg) struct vnet *arg;
+#define VNET_FOREACH(arg) LIST_FOREACH(arg, &vnet_head, vnet_le)
+#else
+#define	VNET_ITERATOR_DECL(arg)
+#define	VNET_FOREACH(arg)
+#endif
+
 /* Non-VIMAGE null-macros */
 #define	IS_DEFAULT_VNET(arg) 1
 #define	CURVNET_SET(arg)
 #define	CURVNET_SET_QUIET(arg)
 #define	CURVNET_RESTORE()
 #define	VNET_ASSERT(condition)
-#define	INIT_FROM_VNET(vnet, modindex, modtype, sym)
-#define	VNET_ITERATOR_DECL(arg)
-#define	VNET_FOREACH(arg)
 #define	VNET_LIST_RLOCK()
 #define	VNET_LIST_RUNLOCK()
 #define	INIT_VPROCG(arg)



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