svn commit: r208297 - stable/8/sys/kern
Andriy Gapon
avg at FreeBSD.org
Wed May 19 10:34:17 UTC 2010
Author: avg
Date: Wed May 19 10:34:15 2010
New Revision: 208297
URL: http://svn.freebsd.org/changeset/base/208297
Log:
MFC r207360: periodically save system time to hardware time-of-day clock
Modified:
stable/8/sys/kern/kern_ntptime.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/xen/xenpci/ (props changed)
stable/8/sys/geom/sched/ (props changed)
Modified: stable/8/sys/kern/kern_ntptime.c
==============================================================================
--- stable/8/sys/kern/kern_ntptime.c Wed May 19 10:29:37 2010 (r208296)
+++ stable/8/sys/kern/kern_ntptime.c Wed May 19 10:34:15 2010 (r208297)
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
+#include <sys/eventhandler.h>
#include <sys/kernel.h>
#include <sys/priv.h>
#include <sys/proc.h>
@@ -972,3 +973,67 @@ kern_adjtime(struct thread *td, struct t
return (0);
}
+static struct callout resettodr_callout;
+static int resettodr_period = 1800;
+
+static void
+periodic_resettodr(void *arg __unused)
+{
+
+ if (!ntp_is_time_error()) {
+ mtx_lock(&Giant);
+ resettodr();
+ mtx_unlock(&Giant);
+ }
+ if (resettodr_period > 0)
+ callout_schedule(&resettodr_callout, resettodr_period * hz);
+}
+
+static void
+shutdown_resettodr(void *arg __unused, int howto __unused)
+{
+
+ callout_drain(&resettodr_callout);
+ if (resettodr_period > 0 && !ntp_is_time_error()) {
+ mtx_lock(&Giant);
+ resettodr();
+ mtx_unlock(&Giant);
+ }
+}
+
+static int
+sysctl_resettodr_period(SYSCTL_HANDLER_ARGS)
+{
+ int error;
+
+ error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req);
+ if (error || !req->newptr)
+ return (error);
+ if (resettodr_period == 0)
+ callout_stop(&resettodr_callout);
+ else
+ callout_reset(&resettodr_callout, resettodr_period * hz,
+ periodic_resettodr, NULL);
+ return (0);
+}
+
+SYSCTL_PROC(_machdep, OID_AUTO, rtc_save_period, CTLTYPE_INT|CTLFLAG_RW,
+ &resettodr_period, 1800, sysctl_resettodr_period, "I",
+ "Save system time to RTC with this period (in seconds)");
+TUNABLE_INT("machdep.rtc_save_period", &resettodr_period);
+
+static void
+start_periodic_resettodr(void *arg __unused)
+{
+
+ EVENTHANDLER_REGISTER(shutdown_pre_sync, shutdown_resettodr, NULL,
+ SHUTDOWN_PRI_FIRST);
+ callout_init(&resettodr_callout, 1);
+ if (resettodr_period == 0)
+ return;
+ callout_reset(&resettodr_callout, resettodr_period * hz,
+ periodic_resettodr, NULL);
+}
+
+SYSINIT(periodic_resettodr, SI_SUB_RUN_SCHEDULER, SI_ORDER_ANY - 1,
+ start_periodic_resettodr, NULL);
More information about the svn-src-all
mailing list