At the request of several developers, restore the DIAGNOSIC code

deleted in 1.81. Increase the initial timeout limit to 2ms to
eliminate spurious messages of excessive timeouts in the NFS
client code.

Requested by:	Poul-Henning Kamp <phk@phk.freebsd.dk>
Requested by:	Mike Silbersack <silby@silby.com>
Requested by:	Sam Leffler <sam@errno.com>
This commit is contained in:
Kirk McKusick 2003-11-12 22:28:27 +00:00
parent f0ab044241
commit 48b0f4b67d

View File

@ -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);