summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_timeout.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/sys/kern/kern_timeout.c b/sys/kern/kern_timeout.c
index f1c4b90..8878500 100644
--- a/sys/kern/kern_timeout.c
+++ b/sys/kern/kern_timeout.c
@@ -70,6 +70,9 @@ int callwheelsize, callwheelbits, callwheelmask;
struct callout_tailq *callwheel;
int softticks; /* Like ticks, but for softclock(). */
struct mtx callout_lock;
+#ifdef DIAGNOSTIC
+struct mtx callout_dont_sleep;
+#endif
static struct callout *nextsoftcheck; /* Next callout to be checked. */
@@ -120,6 +123,9 @@ kern_timeout_callwheel_init(void)
TAILQ_INIT(&callwheel[i]);
}
mtx_init(&callout_lock, "callout", NULL, MTX_SPIN | MTX_RECURSE);
+#ifdef DIAGNOSTIC
+ mtx_init(&callout_dont_sleep, "callout_dont_sleep", NULL, MTX_DEF);
+#endif
}
/*
@@ -148,6 +154,11 @@ softclock(void *dummy)
int depth;
int mpcalls;
int gcalls;
+#ifdef DIAGNOSTIC
+ struct bintime bt1, bt2;
+ struct timespec ts2;
+ static uint64_t maxdt = 36893488147419102LL; /* 2 msec */
+#endif
#ifndef MAX_SOFTCLOCK_STEPS
#define MAX_SOFTCLOCK_STEPS 100 /* Maximum allowed value of steps. */
@@ -207,7 +218,24 @@ softclock(void *dummy)
} else {
mpcalls++;
}
+#ifdef DIAGNOSTIC
+ binuptime(&bt1);
+ mtx_lock(&callout_dont_sleep);
+#endif
c_func(c_arg);
+#ifdef DIAGNOSTIC
+ mtx_unlock(&callout_dont_sleep);
+ binuptime(&bt2);
+ bintime_sub(&bt2, &bt1);
+ if (bt2.frac > maxdt) {
+ maxdt = bt2.frac;
+ bintime2timespec(&bt2, &ts2);
+ printf(
+ "Expensive timeout(9) function: %p(%p) %ld.%09ld s\n",
+ c_func, c_arg,
+ (long)ts2.tv_sec, ts2.tv_nsec);
+ }
+#endif
if (!(c_flags & CALLOUT_MPSAFE))
mtx_unlock(&Giant);
mtx_lock_spin(&callout_lock);
OpenPOWER on IntegriCloud