diff options
-rw-r--r-- | kernel/sysctl.c | 13 | ||||
-rw-r--r-- | kernel/time/ntp.c | 7 |
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); } |