PERFORCE change 112910 for review

Marko Zec zec at FreeBSD.org
Sun Jan 14 18:55:42 UTC 2007


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

Change 112910 by zec at zec_tca51 on 2007/01/14 18:54:54

	In callout_reset() check whether the handle provided by the
	caller is already linked in somewhere in the callout wheel.  If
	it is, panic.
	
	This check can be insanely expensive and shouldn't be compiled
	in under normal circumstances, but at the moment I need this
	for chasing ghosts...

Affected files ...

.. //depot/projects/vimage/src/sys/kern/kern_timeout.c#2 edit

Differences ...

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

@@ -37,6 +37,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD: src/sys/kern/kern_timeout.c,v 1.102 2006/10/11 14:57:03 glebius Exp $");
 
+#include "opt_vimage.h"
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/callout.h>
@@ -465,6 +467,23 @@
 	c->c_flags |= (CALLOUT_ACTIVE | CALLOUT_PENDING);
 	c->c_func = ftn;
 	c->c_time = ticks + to_ticks;
+#if (defined(VIMAGE) && defined(INVARIANTS))
+	/*
+	 * MARKO XXX
+	 *
+	 * I'm suspecting that some lockups might have been caused by
+	 * a single callout handle being scheduled multiple times.
+	 * This loop examines the entire callwhell before inserting a
+	 * new handle, and if the handle is already linked in it panics.
+	 */
+	int callwheel_iter;
+	struct callout *c_iter;
+	for (callwheel_iter = 0; callwheel_iter <= callwheelmask;
+	    callwheel_iter++)
+		TAILQ_FOREACH(c_iter, &callwheel[callwheel_iter], c_links.tqe)
+			if (c_iter == c)
+				panic("finally got you!");
+#endif
 	TAILQ_INSERT_TAIL(&callwheel[c->c_time & callwheelmask], 
 			  c, c_links.tqe);
 	CTR5(KTR_CALLOUT, "%sscheduled %p func %p arg %p in %d",


More information about the p4-projects mailing list