diff --git a/sys/contrib/altq/altq/altq_hfsc.c b/sys/contrib/altq/altq/altq_hfsc.c diff --git a/sys/contrib/altq/altq/altq_subr.c b/sys/contrib/altq/altq/altq_subr.c index 7426e75..0c6e485 100644 --- a/sys/contrib/altq/altq/altq_subr.c +++ b/sys/contrib/altq/altq/altq_subr.c @@ -383,6 +383,7 @@ tbr_set(ifq, profile) if (tbr_dequeue_ptr == NULL) tbr_dequeue_ptr = tbr_dequeue; + tbr_callout_init(); if (machclk_freq == 0) init_machclk(); if (machclk_freq == 0) { @@ -917,13 +918,26 @@ EVENTHANDLER_DEFINE(cpufreq_post_change, tsc_freq_changed, NULL, EVENTHANDLER_PRI_ANY); #endif /* __FreeBSD_version >= 700035 */ +#if (__FreeBSD_version >= 600000) +/* + * Initializes the callout. OBVIOUS: should be called before the + * first use of the tbr_callout. + */ void -init_machclk(void) +tbr_callout_init(void) { -#if (__FreeBSD_version >= 600000) - callout_init(&tbr_callout, 0); -#endif + static int called = 0; + if (!called) { + callout_init(&tbr_callout, 0); + called = 1; + } +} +#endif /* __FreeBSD_version >= 600000 */ + +void +init_machclk(void) +{ machclk_usepcc = 1; #if (!defined(__i386__) && !defined(__alpha__)) || defined(ALTQ_NOPCC) diff --git a/sys/contrib/altq/altq/altq_var.h b/sys/contrib/altq/altq/altq_var.h index 99407fb..3879a28 100644 --- a/sys/contrib/altq/altq/altq_var.h +++ b/sys/contrib/altq/altq/altq_var.h @@ -125,6 +125,11 @@ extern void init_machclk(void); extern u_int64_t read_machclk(void); /* + * Callout initializer. + */ +extern void tbr_callout_init(void); + +/* * debug support */ #ifdef ALTQ_DEBUG