PERFORCE change 149433 for review

Marko Zec zec at FreeBSD.org
Mon Sep 8 16:56:01 UTC 2008


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

Change 149433 by zec at zec_tpx32 on 2008/09/08 16:55:34

	First-cut replacement of VNET_ITERLOOP_BEGIN() /
	VNET_ITERLOOP_END() kludges with VNET_FOREACH() constructs
	discussed at freebsd-virtualization@
	
	Needs a bit more testing before merging over to
	vimage-commit2 branch.

Affected files ...

.. //depot/projects/vimage/src/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c#3 edit
.. //depot/projects/vimage/src/sys/kern/kern_vimage.c#66 edit
.. //depot/projects/vimage/src/sys/net/if.c#36 edit
.. //depot/projects/vimage/src/sys/net/if_ef.c#6 edit
.. //depot/projects/vimage/src/sys/net80211/ieee80211_ddb.c#8 edit
.. //depot/projects/vimage/src/sys/netgraph/atm/ng_atm.c#6 edit
.. //depot/projects/vimage/src/sys/netgraph/ng_gif.c#7 edit
.. //depot/projects/vimage/src/sys/netinet/igmp.c#15 edit
.. //depot/projects/vimage/src/sys/netinet/in_pcb.c#29 edit
.. //depot/projects/vimage/src/sys/netinet/in_rmx.c#18 edit
.. //depot/projects/vimage/src/sys/netinet/ip_input.c#32 edit
.. //depot/projects/vimage/src/sys/netinet/tcp_subr.c#47 edit
.. //depot/projects/vimage/src/sys/netinet/tcp_timer.c#20 edit
.. //depot/projects/vimage/src/sys/netinet6/frag6.c#17 edit
.. //depot/projects/vimage/src/sys/netipsec/key.c#20 edit
.. //depot/projects/vimage/src/sys/sys/vimage.h#63 edit

Differences ...

==== //depot/projects/vimage/src/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c#3 (text+ko) ====

@@ -218,6 +218,7 @@
 static int
 iwch_init_module(void)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	int err;
 	struct ifnet *ifp;
 
@@ -239,12 +240,13 @@
 
 	/* Register existing TOE interfaces by walking the ifnet chain */
 	IFNET_RLOCK();
-	VNET_ITERLOOP_BEGIN();
-	INIT_VNET_NET(curvnet);
-	TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
-		(void)ifaddr_event_handler(NULL, ifp);
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);	/* XXX CURVNET_SET_QUIET() ? */
+		INIT_VNET_NET(vnet_iter);
+		TAILQ_FOREACH(ifp, &V_ifnet, if_link)
+			(void)ifaddr_event_handler(NULL, ifp);
+		CURVNET_RESTORE();
 	}
-	VNET_ITERLOOP_END();
 	IFNET_RUNLOCK();
 	return 0;
 }

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

@@ -187,13 +187,16 @@
 void
 vnet_mod_complete_registration(struct vnet_modlink *vml)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	struct vnet_modlink *vml_iter;
 
 	TAILQ_INSERT_TAIL(&vnet_modlink_head, vml, vml_mod_le);
 
-	VNET_ITERLOOP_BEGIN_QUIET();
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET_QUIET(vnet_iter);
 		vnet_mod_constructor(vml);
-	VNET_ITERLOOP_END();
+		CURVNET_RESTORE();
+	}
 
 	/* Check for pending modules depending on us */
 	do {
@@ -225,6 +228,7 @@
 vnet_mod_deregister_multi(const struct vnet_modinfo *vmi, void *iarg,
     char *iname)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	struct vnet_modlink *vml;
 
 	TAILQ_FOREACH(vml, &vnet_modlink_head, vml_mod_le)
@@ -234,9 +238,11 @@
 		panic("cannot deregister unregistered vnet module %s",
 		    vmi->vmi_name);
 
-	VNET_ITERLOOP_BEGIN_QUIET();
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET_QUIET(vnet_iter);
 		vnet_mod_destructor(vml);
-	VNET_ITERLOOP_END();
+		CURVNET_RESTORE();
+	}
 
 	TAILQ_REMOVE(&vnet_modlink_head, vml, vml_mod_le);
 	vi_free(vml, M_VIMAGE);
@@ -976,9 +982,11 @@
 
 DB_SHOW_COMMAND(vnets, db_show_vnets)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
+
 	db_printf("      vnet ifs socks");
 	db_printf("        net       inet      inet6      ipsec   netgraph\n");
-	VNET_ITERLOOP_BEGIN_QUIET();
+	VNET_FOREACH(vnet_iter) {
 		db_printf("%p %3d %5d",
 		    vnet_iter, vnet_iter->ifccnt, vnet_iter->sockcnt);
 		db_vnet_ptr(vnet_iter->mod_data[VNET_MOD_NET]);
@@ -987,6 +995,6 @@
 		db_vnet_ptr(vnet_iter->mod_data[VNET_MOD_IPSEC]);
 		db_vnet_ptr(vnet_iter->mod_data[VNET_MOD_NETGRAPH]);
 		db_printf("\n");
-	VNET_ITERLOOP_END();
+	}
 }
 #endif

==== //depot/projects/vimage/src/sys/net/if.c#36 (text+ko) ====

@@ -1637,19 +1637,24 @@
 static void
 if_slowtimo(void *arg)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	struct ifnet *ifp;
 	int s = splimp();
 
 	IFNET_RLOCK();
-	VNET_ITERLOOP_BEGIN();
-	INIT_VNET_NET(curvnet);
-	TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
-		if (ifp->if_timer == 0 || --ifp->if_timer)
-			continue;
-		if (ifp->if_watchdog)
-			(*ifp->if_watchdog)(ifp);
+	VNET_LIST_REF();
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);
+		INIT_VNET_NET(vnet_iter);
+		TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
+			if (ifp->if_timer == 0 || --ifp->if_timer)
+				continue;
+			if (ifp->if_watchdog)
+				(*ifp->if_watchdog)(ifp);
+		}
+		CURVNET_RESTORE();
 	}
-	VNET_ITERLOOP_END();
+	VNET_LIST_UNREF();
 	IFNET_RUNLOCK();
 	splx(s);
 	timeout(if_slowtimo, (void *)0, hz / IFNET_SLOWHZ);

==== //depot/projects/vimage/src/sys/net/if_ef.c#6 (text+ko) ====

@@ -485,46 +485,47 @@
 static int
 ef_load(void)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	struct ifnet *ifp;
 	struct efnet *efp;
 	struct ef_link *efl = NULL, *efl_temp;
 	int error = 0, d;
 
 	IFNET_RLOCK();
-	{
-		VNET_ITERLOOP_BEGIN_QUIET();
-			INIT_VNET_NET(curvnet);
-			TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
-				if (ifp->if_type != IFT_ETHER) continue;
-				EFDEBUG("Found interface %s\n", ifp->if_xname);
-				efl = (struct ef_link*)malloc(sizeof(struct ef_link), 
-				    M_IFADDR, M_WAITOK | M_ZERO);
-				if (efl == NULL) {
-					error = ENOMEM;
-					break;
-				}
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);
+		INIT_VNET_NET(vnet_iter);
+		TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
+			if (ifp->if_type != IFT_ETHER) continue;
+			EFDEBUG("Found interface %s\n", ifp->if_xname);
+			efl = (struct ef_link*)malloc(sizeof(struct ef_link), 
+			    M_IFADDR, M_WAITOK | M_ZERO);
+			if (efl == NULL) {
+				error = ENOMEM;
+				break;
+			}
 
-				efl->el_ifp = ifp;
+			efl->el_ifp = ifp;
 #ifdef ETHER_II
-				error = ef_clone(efl, ETHER_FT_EII);
-				if (error) break;
+			error = ef_clone(efl, ETHER_FT_EII);
+			if (error) break;
 #endif
 #ifdef ETHER_8023
-				error = ef_clone(efl, ETHER_FT_8023);
-				if (error) break;
+			error = ef_clone(efl, ETHER_FT_8023);
+			if (error) break;
 #endif
 #ifdef ETHER_8022
-				error = ef_clone(efl, ETHER_FT_8022);
-				if (error) break;
+			error = ef_clone(efl, ETHER_FT_8022);
+			if (error) break;
 #endif
 #ifdef ETHER_SNAP
-				error = ef_clone(efl, ETHER_FT_SNAP);
-				if (error) break;
+			error = ef_clone(efl, ETHER_FT_SNAP);
+			if (error) break;
 #endif
-				efcount++;
-				SLIST_INSERT_HEAD(&efdev, efl, el_next);
-			}
-		VNET_ITERLOOP_END();
+			efcount++;
+			SLIST_INSERT_HEAD(&efdev, efl, el_next);
+		}
+		CURVNET_RESTORE();
 	}
 	IFNET_RUNLOCK();
 	if (error) {

==== //depot/projects/vimage/src/sys/net80211/ieee80211_ddb.c#8 (text+ko) ====

@@ -184,6 +184,7 @@
 
 DB_SHOW_ALL_COMMAND(vaps, db_show_all_vaps)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	const struct ifnet *ifp;
 	int i, showall = 0;
 
@@ -194,24 +195,25 @@
 			break;
 		}
 
-	VNET_ITERLOOP_BEGIN();
-	INIT_VNET_NET(vnet_iter);
-	TAILQ_FOREACH(ifp, &V_ifnet, if_list)
-		if (ifp->if_type == IFT_IEEE80211) {
-			const struct ieee80211com *ic = ifp->if_l2com;
+	VNET_FOREACH(vnet_iter) {
+		INIT_VNET_NET(vnet_iter);
+		TAILQ_FOREACH(ifp, &V_ifnet, if_list)
+			if (ifp->if_type == IFT_IEEE80211) {
+				const struct ieee80211com *ic = ifp->if_l2com;
 
-			if (!showall) {
-				const struct ieee80211vap *vap;
-				db_printf("%s: com %p vaps:",
-				    ifp->if_xname, ic);
-				TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
-					db_printf(" %s(%p)",
-					    vap->iv_ifp->if_xname, vap);
-				db_printf("\n");
-			} else
-				_db_show_com(ic, 1, 1, 1);
-		}
-	VNET_ITERLOOP_END();
+				if (!showall) {
+					const struct ieee80211vap *vap;
+					db_printf("%s: com %p vaps:",
+					    ifp->if_xname, ic);
+					TAILQ_FOREACH(vap, &ic->ic_vaps,
+					    iv_next)
+						db_printf(" %s(%p)",
+						    vap->iv_ifp->if_xname, vap);
+					db_printf("\n");
+				} else
+					_db_show_com(ic, 1, 1, 1);
+			}
+	}
 }
 
 static void

==== //depot/projects/vimage/src/sys/netgraph/atm/ng_atm.c#6 (text+ko) ====

@@ -1380,6 +1380,7 @@
 static int
 ng_atm_mod_event(module_t mod, int event, void *data)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	struct ifnet *ifp;
 	int error = 0;
 
@@ -1402,15 +1403,15 @@
 		ng_atm_input_orphan_p = ng_atm_input_orphans;
 		ng_atm_event_p = ng_atm_event;
 
-		{
-		        VNET_ITERLOOP_BEGIN_QUIET();
-        			INIT_VNET_NET(curvnet);
-				/* Create nodes for existing ATM interfaces */
-				TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
-					if (ifp->if_type == IFT_ATM)
-						ng_atm_attach(ifp);
-				}
-		        VNET_ITERLOOP_END();
+		VNET_FOREACH(vnet_iter) {
+			CURVNET_SET_QUIET(vnet_iter);
+       			INIT_VNET_NET(vnet_iter);
+			/* Create nodes for existing ATM interfaces */
+			TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
+				if (ifp->if_type == IFT_ATM)
+					ng_atm_attach(ifp);
+			}
+			CURVNET_RESTORE();
 		}
 		IFNET_RUNLOCK();
 		break;
@@ -1425,14 +1426,14 @@
 		ng_atm_input_orphan_p = NULL;
 		ng_atm_event_p = NULL;
 
-		{
-		        VNET_ITERLOOP_BEGIN_QUIET();
-        			INIT_VNET_NET(curvnet);
-				TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
-					if (ifp->if_type == IFT_ATM)
-						ng_atm_detach(ifp);
-				}
-		        VNET_ITERLOOP_END();
+		VNET_FOREACH(vnet_iter) {
+			CURVNET_SET_QUIET(vnet_iter);
+       			INIT_VNET_NET(vnet_iter);
+			TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
+				if (ifp->if_type == IFT_ATM)
+					ng_atm_detach(ifp);
+			}
+			CURVNET_RESTORE();
 		}
 		IFNET_RUNLOCK();
 		break;

==== //depot/projects/vimage/src/sys/netgraph/ng_gif.c#7 (text+ko) ====

@@ -542,6 +542,7 @@
 static int
 ng_gif_mod_event(module_t mod, int event, void *data)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	struct ifnet *ifp;
 	int error = 0;
 	int s;
@@ -562,13 +563,15 @@
 
 		/* Create nodes for any already-existing gif interfaces */
 		IFNET_RLOCK();
-		VNET_ITERLOOP_BEGIN_QUIET();
-		INIT_VNET_NET(curvnet);
-		TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
-			if (ifp->if_type == IFT_GIF)
-				ng_gif_attach(ifp);
+		VNET_FOREACH(vnet_iter) {
+			CURVNET_SET_QUIET(vnet_iter); /* XXX revisit quiet */
+			INIT_VNET_NET(curvnet);
+			TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
+				if (ifp->if_type == IFT_GIF)
+					ng_gif_attach(ifp);
+			}
+			CURVNET_RESTORE();
 		}
-		VNET_ITERLOOP_END();
 		IFNET_RUNLOCK();
 		break;
 

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

@@ -426,6 +426,7 @@
 void
 igmp_fasttimo(void)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	register struct in_multi *inm;
 	struct in_multistep step;
 
@@ -439,41 +440,46 @@
 
 	IN_MULTI_LOCK();
 	igmp_timers_are_running = 0;
-	VNET_ITERLOOP_BEGIN();
-	INIT_VNET_INET(vnet_iter);
-	IN_FIRST_MULTI(step, inm);
-	while (inm != NULL) {
-		if (inm->inm_timer == 0) {
-			/* do nothing */
-		} else if (--inm->inm_timer == 0) {
-			igmp_sendpkt(inm, inm->inm_rti->rti_type, 0);
-			inm->inm_state = IGMP_IREPORTEDLAST;
-		} else {
-			igmp_timers_are_running = 1;
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);
+		INIT_VNET_INET(vnet_iter);
+		IN_FIRST_MULTI(step, inm);
+		while (inm != NULL) {
+			if (inm->inm_timer == 0) {
+				/* do nothing */
+			} else if (--inm->inm_timer == 0) {
+				igmp_sendpkt(inm, inm->inm_rti->rti_type, 0);
+				inm->inm_state = IGMP_IREPORTEDLAST;
+			} else {
+				igmp_timers_are_running = 1;
+			}
+			IN_NEXT_MULTI(step, inm);
 		}
-		IN_NEXT_MULTI(step, inm);
+		CURVNET_RESTORE();
 	}
-	VNET_ITERLOOP_END();
 	IN_MULTI_UNLOCK();
 }
 
 void
 igmp_slowtimo(void)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	struct router_info *rti;
 
 	IGMP_PRINTF("[igmp.c,_slowtimo] -- > entering \n");
 	mtx_lock(&igmp_mtx);
-	VNET_ITERLOOP_BEGIN()
-	INIT_VNET_INET(vnet_iter);
-	SLIST_FOREACH(rti, &V_router_info_head, rti_list) {
-		if (rti->rti_type == IGMP_V1_ROUTER) {
-			rti->rti_time++;
-			if (rti->rti_time >= IGMP_AGE_THRESHOLD)
-				rti->rti_type = IGMP_V2_ROUTER;
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);
+		INIT_VNET_INET(vnet_iter);
+		SLIST_FOREACH(rti, &V_router_info_head, rti_list) {
+			if (rti->rti_type == IGMP_V1_ROUTER) {
+				rti->rti_time++;
+				if (rti->rti_time >= IGMP_AGE_THRESHOLD)
+					rti->rti_type = IGMP_V2_ROUTER;
+			}
 		}
+		CURVNET_RESTORE();
 	}
-	VNET_ITERLOOP_END()
 	mtx_unlock(&igmp_mtx);
 	IGMP_PRINTF("[igmp.c,_slowtimo] -- > exiting \n");
 }

==== //depot/projects/vimage/src/sys/netinet/in_pcb.c#29 (text+ko) ====

@@ -1221,16 +1221,20 @@
 void
 ipport_tick(void *xtp)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 
-	VNET_ITERLOOP_BEGIN();
-	INIT_VNET_INET(curvnet);
-	if (V_ipport_tcpallocs <= V_ipport_tcplastcount + V_ipport_randomcps) {
-		if (V_ipport_stoprandom > 0)
-			V_ipport_stoprandom--;
-	} else
-		V_ipport_stoprandom = V_ipport_randomtime;
-	V_ipport_tcplastcount = V_ipport_tcpallocs;
-	VNET_ITERLOOP_END();
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);	/* XXX appease INVARIANTS here */
+		INIT_VNET_INET(vnet_iter);
+		if (V_ipport_tcpallocs <=
+		    V_ipport_tcplastcount + V_ipport_randomcps) {
+			if (V_ipport_stoprandom > 0)
+				V_ipport_stoprandom--;
+		} else
+			V_ipport_stoprandom = V_ipport_randomtime;
+		V_ipport_tcplastcount = V_ipport_tcpallocs;
+		CURVNET_RESTORE();
+	}
 	callout_reset(&ipport_tick_callout, hz, ipport_tick, NULL);
 }
 

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

@@ -336,25 +336,28 @@
 void
 in_rtqdrain(void)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	struct radix_node_head *rnh;
 	struct rtqk_arg arg;
 	int 	fibnum;
 
-	VNET_ITERLOOP_BEGIN();
-	INIT_VNET_NET(vnet_iter);
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);
+		INIT_VNET_NET(vnet_iter);
 
-	for ( fibnum = 0; fibnum < rt_numfibs; fibnum++) {
-		rnh = V_rt_tables[fibnum][AF_INET];
-		arg.found = arg.killed = 0;
-		arg.rnh = rnh;
-		arg.nextstop = 0;
-		arg.draining = 1;
-		arg.updating = 0;
-		RADIX_NODE_HEAD_LOCK(rnh);
-		rnh->rnh_walktree(rnh, in_rtqkill, &arg);
-		RADIX_NODE_HEAD_UNLOCK(rnh);
+		for ( fibnum = 0; fibnum < rt_numfibs; fibnum++) {
+			rnh = V_rt_tables[fibnum][AF_INET];
+			arg.found = arg.killed = 0;
+			arg.rnh = rnh;
+			arg.nextstop = 0;
+			arg.draining = 1;
+			arg.updating = 0;
+			RADIX_NODE_HEAD_LOCK(rnh);
+			rnh->rnh_walktree(rnh, in_rtqkill, &arg);
+			RADIX_NODE_HEAD_UNLOCK(rnh);
+		}
+		CURVNET_RESTORE();
 	}
-	VNET_ITERLOOP_END();
 }
 
 static int _in_rt_was_here;

==== //depot/projects/vimage/src/sys/netinet/ip_input.c#32 (text+ko) ====

@@ -1145,39 +1145,45 @@
 void
 ip_slowtimo(void)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	struct ipq *fp;
 	int i;
 
 	IPQ_LOCK();
-	VNET_ITERLOOP_BEGIN();
-	INIT_VNET_INET(vnet_iter);
-	for (i = 0; i < IPREASS_NHASH; i++) {
-		for(fp = TAILQ_FIRST(&V_ipq[i]); fp;) {
-			struct ipq *fpp;
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);
+		INIT_VNET_INET(vnet_iter);
+		for (i = 0; i < IPREASS_NHASH; i++) {
+			for(fp = TAILQ_FIRST(&V_ipq[i]); fp;) {
+				struct ipq *fpp;
 
-			fpp = fp;
-			fp = TAILQ_NEXT(fp, ipq_list);
-			if(--fpp->ipq_ttl == 0) {
-				V_ipstat.ips_fragtimeout += fpp->ipq_nfrags;
-				ip_freef(&V_ipq[i], fpp);
+				fpp = fp;
+				fp = TAILQ_NEXT(fp, ipq_list);
+				if(--fpp->ipq_ttl == 0) {
+					V_ipstat.ips_fragtimeout +=
+					    fpp->ipq_nfrags;
+					ip_freef(&V_ipq[i], fpp);
+				}
 			}
 		}
-	}
-	/*
-	 * If we are over the maximum number of fragments
-	 * (due to the limit being lowered), drain off
-	 * enough to get down to the new limit.
-	 */
-	if (V_maxnipq >= 0 && V_nipq > V_maxnipq) {
-		for (i = 0; i < IPREASS_NHASH; i++) {
-			while (V_nipq > V_maxnipq && !TAILQ_EMPTY(&V_ipq[i])) {
-				V_ipstat.ips_fragdropped +=
-				    TAILQ_FIRST(&V_ipq[i])->ipq_nfrags;
-				ip_freef(&V_ipq[i], TAILQ_FIRST(&V_ipq[i]));
+		/*
+		 * If we are over the maximum number of fragments
+		 * (due to the limit being lowered), drain off
+		 * enough to get down to the new limit.
+		 */
+		if (V_maxnipq >= 0 && V_nipq > V_maxnipq) {
+			for (i = 0; i < IPREASS_NHASH; i++) {
+				while (V_nipq > V_maxnipq &&
+				    !TAILQ_EMPTY(&V_ipq[i])) {
+					V_ipstat.ips_fragdropped +=
+					    TAILQ_FIRST(&V_ipq[i])->ipq_nfrags;
+					ip_freef(&V_ipq[i],
+					    TAILQ_FIRST(&V_ipq[i]));
+				}
 			}
 		}
+		CURVNET_RESTORE();
 	}
-	VNET_ITERLOOP_END();
 	IPQ_UNLOCK();
 }
 
@@ -1187,19 +1193,22 @@
 void
 ip_drain(void)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	int     i;
 
 	IPQ_LOCK();
-	VNET_ITERLOOP_BEGIN();
-	INIT_VNET_INET(vnet_iter);
-	for (i = 0; i < IPREASS_NHASH; i++) {
-		while(!TAILQ_EMPTY(&V_ipq[i])) {
-			V_ipstat.ips_fragdropped +=
-			    TAILQ_FIRST(&V_ipq[i])->ipq_nfrags;
-			ip_freef(&V_ipq[i], TAILQ_FIRST(&V_ipq[i]));
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);
+		INIT_VNET_INET(vnet_iter);
+		for (i = 0; i < IPREASS_NHASH; i++) {
+			while(!TAILQ_EMPTY(&V_ipq[i])) {
+				V_ipstat.ips_fragdropped +=
+				    TAILQ_FIRST(&V_ipq[i])->ipq_nfrags;
+				ip_freef(&V_ipq[i], TAILQ_FIRST(&V_ipq[i]));
+			}
 		}
+		CURVNET_RESTORE();
 	}
-	VNET_ITERLOOP_END();
 	IPQ_UNLOCK();
 	in_rtqdrain();
 }

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

@@ -903,8 +903,13 @@
 void
 tcp_drain(void)
 {
-	if (do_tcpdrain) {
-		VNET_ITERLOOP_BEGIN();
+	VNET_ITERATOR_DECL(vnet_iter);
+
+	if (!do_tcpdrain)
+		return;
+
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);
 		INIT_VNET_INET(vnet_iter);
 		struct inpcb *inpb;
 		struct tcpcb *tcpb;
@@ -937,7 +942,7 @@
 			INP_WUNLOCK(inpb);
 		}
 		INP_INFO_RUNLOCK(&V_tcbinfo);
-		VNET_ITERLOOP_END();
+		CURVNET_RESTORE();
 	}
 }
 
@@ -1546,18 +1551,22 @@
 static void
 tcp_isn_tick(void *xtp)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	u_int32_t projected_offset;
 
 	ISN_LOCK();
-	VNET_ITERLOOP_BEGIN();
-	INIT_VNET_INET(curvnet);
-	projected_offset = V_isn_offset_old + ISN_BYTES_PER_SECOND / 100;
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter); /* XXX appease INVARIANTS */
+		INIT_VNET_INET(curvnet);
+		projected_offset =
+		    V_isn_offset_old + ISN_BYTES_PER_SECOND / 100;
 
-	if (SEQ_GT(projected_offset, V_isn_offset))
-		V_isn_offset = projected_offset;
+		if (SEQ_GT(projected_offset, V_isn_offset))
+			V_isn_offset = projected_offset;
 
-	V_isn_offset_old = V_isn_offset;
-	VNET_ITERLOOP_END();
+		V_isn_offset_old = V_isn_offset;
+		CURVNET_RESTORE();
+	}
 	callout_reset(&isn_callout, hz/100, tcp_isn_tick, NULL);
 	ISN_UNLOCK();
 }

==== //depot/projects/vimage/src/sys/netinet/tcp_timer.c#20 (text+ko) ====

@@ -126,14 +126,17 @@
 void
 tcp_slowtimo(void)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 
-	VNET_ITERLOOP_BEGIN();
-	INIT_VNET_INET(vnet_iter);
-	tcp_maxidle = tcp_keepcnt * tcp_keepintvl;
-	INP_INFO_WLOCK(&V_tcbinfo);
-	(void) tcp_tw_2msl_scan(0);
-	INP_INFO_WUNLOCK(&V_tcbinfo);
-	VNET_ITERLOOP_END();
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);
+		INIT_VNET_INET(vnet_iter);
+		tcp_maxidle = tcp_keepcnt * tcp_keepintvl;
+		INP_INFO_WLOCK(&V_tcbinfo);
+		(void) tcp_tw_2msl_scan(0);
+		INP_INFO_WUNLOCK(&V_tcbinfo);
+		CURVNET_RESTORE();
+	}
 }
 
 int	tcp_syn_backoff[TCP_MAXRXTSHIFT + 1] =

==== //depot/projects/vimage/src/sys/netinet6/frag6.c#17 (text+ko) ====

@@ -693,34 +693,37 @@
 void
 frag6_slowtimo(void)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	struct ip6q *q6;
 
 	IP6Q_LOCK();
-	VNET_ITERLOOP_BEGIN()
-	INIT_VNET_INET6(curvnet);
-	q6 = V_ip6q.ip6q_next;
-	if (q6)
-		while (q6 != &V_ip6q) {
-			--q6->ip6q_ttl;
-			q6 = q6->ip6q_next;
-			if (q6->ip6q_prev->ip6q_ttl == 0) {
-				V_ip6stat.ip6s_fragtimeout++;
-				/* XXX in6_ifstat_inc(ifp, ifs6_reass_fail) */
-				frag6_freef(q6->ip6q_prev);
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);
+		INIT_VNET_INET6(curvnet);
+		q6 = V_ip6q.ip6q_next;
+		if (q6)
+			while (q6 != &V_ip6q) {
+				--q6->ip6q_ttl;
+				q6 = q6->ip6q_next;
+				if (q6->ip6q_prev->ip6q_ttl == 0) {
+					V_ip6stat.ip6s_fragtimeout++;
+					/* XXX in6_ifstat_inc(ifp, ifs6_reass_fail) */
+					frag6_freef(q6->ip6q_prev);
+				}
 			}
+		/*
+		 * If we are over the maximum number of fragments
+		 * (due to the limit being lowered), drain off
+		 * enough to get down to the new limit.
+		 */
+		while (V_frag6_nfragpackets > (u_int)V_ip6_maxfragpackets &&
+		    V_ip6q.ip6q_prev) {
+			V_ip6stat.ip6s_fragoverflow++;
+			/* XXX in6_ifstat_inc(ifp, ifs6_reass_fail) */
+			frag6_freef(V_ip6q.ip6q_prev);
 		}
-	/*
-	 * If we are over the maximum number of fragments
-	 * (due to the limit being lowered), drain off
-	 * enough to get down to the new limit.
-	 */
-	while (V_frag6_nfragpackets > (u_int)V_ip6_maxfragpackets &&
-	    V_ip6q.ip6q_prev) {
-		V_ip6stat.ip6s_fragoverflow++;
-		/* XXX in6_ifstat_inc(ifp, ifs6_reass_fail) */
-		frag6_freef(V_ip6q.ip6q_prev);
+		CURVNET_RESTORE();
 	}
-	VNET_ITERLOOP_END()
 	IP6Q_UNLOCK();
 
 #if 0
@@ -746,16 +749,19 @@
 void
 frag6_drain(void)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 
 	if (IP6Q_TRYLOCK() == 0)
 		return;
-	VNET_ITERLOOP_BEGIN()
-	INIT_VNET_INET6(curvnet);
-	while (V_ip6q.ip6q_next != &V_ip6q) {
-		V_ip6stat.ip6s_fragdropped++;
-		/* XXX in6_ifstat_inc(ifp, ifs6_reass_fail) */
-		frag6_freef(V_ip6q.ip6q_next);
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);
+		INIT_VNET_INET6(vnet_iter);
+		while (V_ip6q.ip6q_next != &V_ip6q) {
+			V_ip6stat.ip6s_fragdropped++;
+			/* XXX in6_ifstat_inc(ifp, ifs6_reass_fail) */
+			frag6_freef(V_ip6q.ip6q_next);
+		}
+		CURVNET_RESTORE();
 	}
-	VNET_ITERLOOP_END()
 	IP6Q_UNLOCK();
 }

==== //depot/projects/vimage/src/sys/netipsec/key.c#20 (text+ko) ====

@@ -4344,14 +4344,17 @@
 void
 key_timehandler(void)
 {
+	VNET_ITERATOR_DECL(vnet_iter);
 	time_t now = time_second;
 	
-	VNET_ITERLOOP_BEGIN();
-	key_flush_spd(now);
-	key_flush_sad(now);
-	key_flush_acq(now);
-	key_flush_spacq(now);
-	VNET_ITERLOOP_END();
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);
+		key_flush_spd(now);
+		key_flush_sad(now);
+		key_flush_acq(now);
+		key_flush_spacq(now);
+		CURVNET_RESTORE();
+	}
 
 #ifndef IPSEC_DEBUG2
 	/* do exchange to tick time !! */

==== //depot/projects/vimage/src/sys/sys/vimage.h#63 (text+ko) ====

@@ -219,23 +219,6 @@
 		      vnet, curvnet);					\
 	modtype *sym = (vnet)->mod_data[modindex];
 
-#define VNET_ITERLOOP_BEGIN()						\
-	struct vnet *vnet_iter;						\
-	VNET_LIST_REF();						\
-	LIST_FOREACH(vnet_iter, &vnet_head, vnet_le) {			\
-		CURVNET_SET(vnet_iter);
-
-#define VNET_ITERLOOP_BEGIN_QUIET()					\
-	struct vnet *vnet_iter;						\
-	VNET_LIST_REF();						\
-	LIST_FOREACH(vnet_iter, &vnet_head, vnet_le) {			\
-		CURVNET_SET_QUIET(vnet_iter);
-
-#define VNET_ITERLOOP_END()						\
-		CURVNET_RESTORE();					\
-	}								\
-	VNET_LIST_UNREF();
-
 #else /* !VNET_DEBUG */
 
 #define VNET_ASSERT(condition)
@@ -253,20 +236,10 @@
 #define INIT_FROM_VNET(vnet, modindex, modtype, sym)			\
 	modtype *sym = (vnet)->mod_data[modindex];
 
-#define VNET_ITERLOOP_BEGIN()						\
-	struct vnet *vnet_iter;						\
-	VNET_LIST_REF();						\
-	LIST_FOREACH(vnet_iter, &vnet_head, vnet_le) {			\
-		CURVNET_SET(vnet_iter);
+#endif /* !VNET_DEBUG */
 
-#define VNET_ITERLOOP_BEGIN_QUIET()	VNET_ITERLOOP_BEGIN()	
-
-#define VNET_ITERLOOP_END()						\
-		CURVNET_RESTORE();					\
-	}								\
-	VNET_LIST_UNREF();
-
-#endif /* !VNET_DEBUG */
+#define VNET_ITERATOR_DECL(arg)	struct vnet *arg;
+#define VNET_FOREACH(arg) LIST_FOREACH(arg, &vnet_head, vnet_le)
 
 #define INIT_VPROCG(arg)	struct vprocg *vprocg = (arg);
 
@@ -301,9 +274,10 @@
 #define VNET_ASSERT(condition)
 #define VSYM(base, sym) (sym)
 #define INIT_FROM_VNET(vnet, modindex, modtype, sym)
-#define VNET_ITERLOOP_BEGIN()
-#define VNET_ITERLOOP_BEGIN_QUIET()
-#define VNET_ITERLOOP_END()
+#define VNET_ITERATOR_DECL(arg)
+#define VNET_FOREACH(arg)
+#define VNET_LIST_REF()
+#define VNET_LIST_UNREF()
 #define INIT_VPROCG(arg)
 #define VPROCG_ITERLOOP_BEGIN()
 #define VPROCG_ITERLOOP_END()


More information about the p4-projects mailing list