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