diff options
author | mav <mav@FreeBSD.org> | 2010-07-11 16:47:45 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2010-07-11 16:47:45 +0000 |
commit | d760bd51fb58638d7611c9053c1550331eba5322 (patch) | |
tree | 3a027d3249a44f1568ec4d29afe6a30c20a82597 /sys/kern/kern_tc.c | |
parent | 9712e9de77c6576615b42258f1551f2036262bdf (diff) | |
download | FreeBSD-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.c | 50 |
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; |