diff options
author | mav <mav@FreeBSD.org> | 2010-09-14 08:48:06 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2010-09-14 08:48:06 +0000 |
commit | 6c05aa4db6d1ea20da8eca83a1214b74821b32d8 (patch) | |
tree | ad6e771c5b5091a633bf1f813ca1f742162ecb96 /sys/kern/kern_clocksource.c | |
parent | 5864d6e457c81a0a80b2ab3b57ee852e6f62efcb (diff) | |
download | FreeBSD-src-6c05aa4db6d1ea20da8eca83a1214b74821b32d8.zip FreeBSD-src-6c05aa4db6d1ea20da8eca83a1214b74821b32d8.tar.gz |
Make kern_tc.c provide minimum frequency of tc_ticktock() calls, required
to handle current timecounter wraps. Make kern_clocksource.c to honor that
requirement, scheduling sleeps on first CPU for no more then specified
period. Allow other CPUs to sleep up to 1/4 second (for any case).
Diffstat (limited to 'sys/kern/kern_clocksource.c')
-rw-r--r-- | sys/kern/kern_clocksource.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/kern/kern_clocksource.c b/sys/kern/kern_clocksource.c index 7654ace..e366ef9 100644 --- a/sys/kern/kern_clocksource.c +++ b/sys/kern/kern_clocksource.c @@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$"); #include <sys/smp.h> #include <sys/sysctl.h> #include <sys/timeet.h> +#include <sys/timetc.h> #include <machine/atomic.h> #include <machine/clock.h> @@ -247,7 +248,10 @@ getnextcpuevent(struct bintime *event, int idle) state = DPCPU_PTR(timerstate); *event = state->nexthard; if (idle) { /* If CPU is idle - ask callouts for how long. */ - skip = callout_tickstofirst() - 1; + skip = 4; + if (curcpu == CPU_FIRST() && tc_min_ticktock_freq > skip) + skip = tc_min_ticktock_freq; + skip = callout_tickstofirst(hz / skip) - 1; CTR2(KTR_SPARE2, "skip at %d: %d", curcpu, skip); tmp = hardperiod; bintime_mul(&tmp, skip); |