summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_clocksource.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2010-09-21 16:50:24 +0000
committermav <mav@FreeBSD.org>2010-09-21 16:50:24 +0000
commite7b0e3848ac6bbe7b09f5c54d49f586380cc7063 (patch)
tree1f7b7fd6865fbef65db68d1220f0fe758f4ca13d /sys/kern/kern_clocksource.c
parent4c422ff8ec5bd68c8f5702007f8750521364ad9d (diff)
downloadFreeBSD-src-e7b0e3848ac6bbe7b09f5c54d49f586380cc7063.zip
FreeBSD-src-e7b0e3848ac6bbe7b09f5c54d49f586380cc7063.tar.gz
Remember last kern.eventtimer.periodic value, explicitly set by user.
If timer capabilities forcing us to change periodicity mode, try to restore it back later, as soon as new choosen timer capable to do it. Without this, timer change like HPET->RTC->HPET always results in enabling periodic mode.
Diffstat (limited to 'sys/kern/kern_clocksource.c')
-rw-r--r--sys/kern/kern_clocksource.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/kern/kern_clocksource.c b/sys/kern/kern_clocksource.c
index eb20a40..455564b 100644
--- a/sys/kern/kern_clocksource.c
+++ b/sys/kern/kern_clocksource.c
@@ -117,7 +117,8 @@ SYSCTL_INT(_kern_eventtimer, OID_AUTO, idletick, CTLFLAG_RW, &idletick,
0, "Run periodic events when idle");
static int periodic = 0; /* Periodic or one-shot mode. */
-TUNABLE_INT("kern.eventtimer.periodic", &periodic);
+static int want_periodic = 0; /* What mode to prefer. */
+TUNABLE_INT("kern.eventtimer.periodic", &want_periodic);
struct pcpu_state {
struct mtx et_hw_mtx; /* Per-CPU timer mutex. */
@@ -587,6 +588,7 @@ cpu_initclocks_bsp(void)
#ifdef SMP
callout_new_inserted = cpu_new_callout;
#endif
+ periodic = want_periodic;
/* Grab requested timer or the best of present. */
if (timername[0])
timer = et_find(timername, 0, 0);
@@ -841,6 +843,7 @@ sysctl_kern_eventtimer_timer(SYSCTL_HANDLER_ARGS)
cpu_disable_deep_sleep++;
if (timer->et_flags & ET_FLAGS_C3STOP)
cpu_disable_deep_sleep--;
+ periodic = want_periodic;
timer = et;
et_init(timer, timercb, NULL, NULL);
configtimer(1);
@@ -865,7 +868,7 @@ sysctl_kern_eventtimer_periodic(SYSCTL_HANDLER_ARGS)
return (error);
ET_LOCK();
configtimer(0);
- periodic = val;
+ periodic = want_periodic = val;
configtimer(1);
ET_UNLOCK();
return (error);
OpenPOWER on IntegriCloud