summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/sysctl.c13
-rw-r--r--kernel/time/ntp.c7
2 files changed, 18 insertions, 2 deletions
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 730ab56d9e92..b0ed07185e3e 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -94,6 +94,8 @@
#if defined(CONFIG_SYSCTL)
+extern unsigned int sysctl_ntp_rtc_sync;
+
/* Constants used for minimum and maximum */
#ifdef CONFIG_PERF_EVENTS
@@ -1659,6 +1661,17 @@ int proc_do_static_key(struct ctl_table *table, int write,
}
static struct ctl_table kern_table[] = {
+#if defined(CONFIG_GENERIC_CMOS_UPDATE) || defined(CONFIG_RTC_SYSTOHC)
+ {
+ .procname = "ntp_rtc_sync",
+ .data = &sysctl_ntp_rtc_sync,
+ .maxlen = sizeof(sysctl_ntp_rtc_sync),
+ .mode = 0644,
+ .proc_handler = proc_douintvec_minmax,
+ .extra1 = SYSCTL_ZERO,
+ .extra2 = SYSCTL_ONE,
+ },
+#endif
{
.procname = "sched_child_runs_first",
.data = &sysctl_sched_child_runs_first,
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
index 406dccb79c2b..85a56b888671 100644
--- a/kernel/time/ntp.c
+++ b/kernel/time/ntp.c
@@ -494,6 +494,7 @@ out:
return leap;
}
+unsigned int sysctl_ntp_rtc_sync = true;
#if defined(CONFIG_GENERIC_CMOS_UPDATE) || defined(CONFIG_RTC_SYSTOHC)
static void sync_hw_clock(struct work_struct *work);
static DECLARE_WORK(sync_work, sync_hw_clock);
@@ -635,7 +636,8 @@ static void sync_hw_clock(struct work_struct *work)
* managed to schedule the work between the timer firing and the
* work being able to rearm the timer. Wait for the timer to expire.
*/
- if (!ntp_synced() || hrtimer_is_queued(&sync_hrtimer))
+ if (!ntp_synced() || !sysctl_ntp_rtc_sync ||
+ hrtimer_is_queued(&sync_hrtimer))
return;
ktime_get_real_ts64(&now);
@@ -667,7 +669,8 @@ void ntp_notify_cmos_timer(void)
* rearmed this queues the work immediately again. No big issue,
* just a pointless work scheduled.
*/
- if (ntp_synced() && !hrtimer_is_queued(&sync_hrtimer))
+ if (ntp_synced() && sysctl_ntp_rtc_sync &&
+ !hrtimer_is_queued(&sync_hrtimer))
queue_work(system_freezable_power_efficient_wq, &sync_work);
}