svn commit: r192278 - head/sys/contrib/altq/altq

Bjoern A. Zeeb bz at FreeBSD.org
Mon May 18 01:05:10 UTC 2009


Author: bz
Date: Mon May 18 01:05:09 2009
New Revision: 192278
URL: http://svn.freebsd.org/changeset/base/192278

Log:
  tbr_timeout() is a timer driven function[1]. While the previous commit
  made LINT happy this does the proper looping over all vnets as we are
  only called `globally' and not once per vnet instance.
  
  Reported by:	zec [1]
  Missed by:	bz  [1] in r192264
  Reviewed by:	zec

Modified:
  head/sys/contrib/altq/altq/altq_subr.c

Modified: head/sys/contrib/altq/altq/altq_subr.c
==============================================================================
--- head/sys/contrib/altq/altq/altq_subr.c	Mon May 18 01:00:11 2009	(r192277)
+++ head/sys/contrib/altq/altq/altq_subr.c	Mon May 18 01:05:09 2009	(r192278)
@@ -454,7 +454,9 @@ static void
 tbr_timeout(arg)
 	void *arg;
 {
-	INIT_VNET_NET(curvnet);
+#if defined(__FreeBSD__)
+	VNET_ITERATOR_DECL(vnet_iter);
+#endif
 	struct ifnet *ifp;
 	int active, s;
 
@@ -466,16 +468,25 @@ tbr_timeout(arg)
 #endif
 #if defined(__FreeBSD__) && (__FreeBSD_version >= 500000)
 	IFNET_RLOCK();
-#endif
-	for (ifp = TAILQ_FIRST(&V_ifnet); ifp; ifp = TAILQ_NEXT(ifp, if_list)) {
-		/* read from if_snd unlocked */
-		if (!TBR_IS_ENABLED(&ifp->if_snd))
-			continue;
-		active++;
-		if (!IFQ_IS_EMPTY(&ifp->if_snd) && ifp->if_start != NULL)
-			(*ifp->if_start)(ifp);
-	}
+	VNET_LIST_RLOCK();
+	VNET_FOREACH(vnet_iter) {
+		CURVNET_SET(vnet_iter);
+		INIT_VNET_NET(vnet_iter);
+#endif
+		for (ifp = TAILQ_FIRST(&V_ifnet); ifp;
+		    ifp = TAILQ_NEXT(ifp, if_list)) {
+			/* read from if_snd unlocked */
+			if (!TBR_IS_ENABLED(&ifp->if_snd))
+				continue;
+			active++;
+			if (!IFQ_IS_EMPTY(&ifp->if_snd) &&
+			    ifp->if_start != NULL)
+				(*ifp->if_start)(ifp);
+		}
 #if defined(__FreeBSD__) && (__FreeBSD_version >= 500000)
+		CURVNET_RESTORE();
+	}
+	VNET_LIST_RUNLOCK();
 	IFNET_RUNLOCK();
 #endif
 	splx(s);


More information about the svn-src-all mailing list