summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_tc.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2010-07-11 16:47:45 +0000
committermav <mav@FreeBSD.org>2010-07-11 16:47:45 +0000
commitd760bd51fb58638d7611c9053c1550331eba5322 (patch)
tree3a027d3249a44f1568ec4d29afe6a30c20a82597 /sys/kern/kern_tc.c
parent9712e9de77c6576615b42258f1551f2036262bdf (diff)
downloadFreeBSD-src-d760bd51fb58638d7611c9053c1550331eba5322.zip
FreeBSD-src-d760bd51fb58638d7611c9053c1550331eba5322.tar.gz
Remove interval validation from cpu_tick_calibrate(). As I found, check
was needed at preliminary version of the patch, where number of CPU ticks was divided strictly on 16 seconds. Final code instead uses real interval duration, so precise interval should not be important. Same time aliasing issues around second boundary causes false positives, periodically logging useless "t_delta ... too long/short" messages when HZ set below 256.
Diffstat (limited to 'sys/kern/kern_tc.c')
-rw-r--r--sys/kern/kern_tc.c50
1 files changed, 14 insertions, 36 deletions
diff --git a/sys/kern/kern_tc.c b/sys/kern/kern_tc.c
index fb3ab11..d973348 100644
--- a/sys/kern/kern_tc.c
+++ b/sys/kern/kern_tc.c
@@ -864,43 +864,21 @@ cpu_tick_calibrate(int reset)
t_delta = t_this;
bintime_sub(&t_delta, &t_last);
/*
- * Validate that 16 +/- 1/256 seconds passed.
- * After division by 16 this gives us a precision of
- * roughly 250PPM which is sufficient
+ * Headroom:
+ * 2^(64-20) / 16[s] =
+ * 2^(44) / 16[s] =
+ * 17.592.186.044.416 / 16 =
+ * 1.099.511.627.776 [Hz]
*/
- if (t_delta.sec > 16 || (
- t_delta.sec == 16 && t_delta.frac >= (0x01LL << 56))) {
- /* too long */
- if (bootverbose)
- printf("t_delta %ju.%016jx too long\n",
- (uintmax_t)t_delta.sec,
- (uintmax_t)t_delta.frac);
- } else if (t_delta.sec < 15 ||
- (t_delta.sec == 15 && t_delta.frac <= (0xffLL << 56))) {
- /* too short */
- if (bootverbose)
- printf("t_delta %ju.%016jx too short\n",
- (uintmax_t)t_delta.sec,
- (uintmax_t)t_delta.frac);
- } else {
- /* just right */
- /*
- * Headroom:
- * 2^(64-20) / 16[s] =
- * 2^(44) / 16[s] =
- * 17.592.186.044.416 / 16 =
- * 1.099.511.627.776 [Hz]
- */
- divi = t_delta.sec << 20;
- divi |= t_delta.frac >> (64 - 20);
- c_delta <<= 20;
- c_delta /= divi;
- if (c_delta > cpu_tick_frequency) {
- if (0 && bootverbose)
- printf("cpu_tick increased to %ju Hz\n",
- c_delta);
- cpu_tick_frequency = c_delta;
- }
+ divi = t_delta.sec << 20;
+ divi |= t_delta.frac >> (64 - 20);
+ c_delta <<= 20;
+ c_delta /= divi;
+ if (c_delta > cpu_tick_frequency) {
+ if (0 && bootverbose)
+ printf("cpu_tick increased to %ju Hz\n",
+ c_delta);
+ cpu_tick_frequency = c_delta;
}
}
c_last = c_this;
OpenPOWER on IntegriCloud