Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 14 Jan 2007 18:56:42 GMT
From:      Marko Zec <zec@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 112911 for review
Message-ID:  <200701141856.l0EIug7d055877@repoman.freebsd.org>

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

Change 112911 by zec@zec_tca51 on 2007/01/14 18:56:38

	Use a separate rtq_timer callout handle for each vnet instance.
	
	Cought by: change 112910

Affected files ...

.. //depot/projects/vimage/src/sys/netinet/in_rmx.c#3 edit
.. //depot/projects/vimage/src/sys/netinet/vinet.h#7 edit

Differences ...

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

@@ -57,6 +57,7 @@
 #include <net/vnet.h>
 #include <net/if.h>
 #include <net/route.h>
+#include <netinet/vinet.h>
 #include <netinet/in.h>
 #include <netinet/in_var.h>
 #include <netinet/ip_var.h>
@@ -253,20 +254,29 @@
 }
 
 #define RTQ_TIMEOUT	60*10	/* run no less than once every ten minutes */
-static int rtq_timeout = RTQ_TIMEOUT;
+#ifndef VIMAGE
+static int rtq_timeout;
 static struct callout rtq_timer;
+#endif
 
 static void
 in_rtqtimo(void *rock)
 {
+	CURVNETB_SET_QUIET((struct vnet_base *) rock);
+	INIT_VNET_NET((struct vnet_base *) rock);
+	INIT_VNET_INET((struct vnet_base *) rock);
+#ifdef VIMAGE
+	struct radix_node_head *rnh = V_rt_tables[AF_INET];
+#else
 	struct radix_node_head *rnh = rock;
+#endif
 	struct rtqk_arg arg;
 	struct timeval atv;
 	static time_t last_adjusted_timeout = 0;
 
 	arg.found = arg.killed = 0;
 	arg.rnh = rnh;
-	arg.nextstop = time_uptime + rtq_timeout;
+	arg.nextstop = time_uptime + V_rtq_timeout;
 	arg.draining = arg.updating = 0;
 	RADIX_NODE_HEAD_LOCK(rnh);
 	rnh->rnh_walktree(rnh, in_rtqkill, &arg);
@@ -281,7 +291,7 @@
 	 * hard.
 	 */
 	if ((arg.found - arg.killed > rtq_toomany) &&
-	    (time_uptime - last_adjusted_timeout >= rtq_timeout) &&
+	    (time_uptime - last_adjusted_timeout >= V_rtq_timeout) &&
 	    rtq_reallyold > rtq_minreallyold) {
 		rtq_reallyold = 2 * rtq_reallyold / 3;
 		if (rtq_reallyold < rtq_minreallyold) {
@@ -302,7 +312,8 @@
 
 	atv.tv_usec = 0;
 	atv.tv_sec = arg.nextstop - time_uptime;
-	callout_reset(&rtq_timer, tvtohz(&atv), in_rtqtimo, rock);
+	callout_reset(&V_rtq_timer, tvtohz(&atv), in_rtqtimo, rock);
+	CURVNETB_RESTORE();
 }
 
 void
@@ -329,6 +340,7 @@
 in_inithead(void **head, int off)
 {
 	INIT_VNET_NET(curvnetb);
+	INIT_VNET_INET(curvnetb);
 	struct radix_node_head *rnh;
 
 	if (!rn_inithead(head, off))
@@ -337,12 +349,17 @@
 	if (head != (void **)&V_rt_tables[AF_INET])	/* BOGUS! */
 		return 1;	/* only do this for the real routing table */
 
+	V_rtq_timeout = RTQ_TIMEOUT;
 	rnh = *head;
 	rnh->rnh_addaddr = in_addroute;
 	rnh->rnh_matchaddr = in_matroute;
 	rnh->rnh_close = in_clsroute;
-	callout_init(&rtq_timer, CALLOUT_MPSAFE);
+	callout_init(&V_rtq_timer, CALLOUT_MPSAFE);
+#ifdef VIMAGE
+	in_rtqtimo(curvnetb);	/* kick off timeout first time */
+#else
 	in_rtqtimo(rnh);	/* kick off timeout first time */
+#endif
 	return 1;
 }
 

==== //depot/projects/vimage/src/sys/netinet/vinet.h#7 (text+ko) ====

@@ -95,6 +95,9 @@
 	struct	igmpstat _igmpstat;
 
 	SLIST_HEAD(, router_info) _router_info_head;
+
+	int	_rtq_timeout;
+	struct	callout _rtq_timer;
 };
 
 extern struct vnet_inet vnet_inet_0;
@@ -149,4 +152,7 @@
 
 #define V_router_info_head	VNET_INET(router_info_head)
 
+#define V_rtq_timeout		VNET_INET(rtq_timeout)
+#define V_rtq_timer		VNET_INET(rtq_timer)
+
 #endif /* !_NETINET_VINET_H_ */



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