diff options
Diffstat (limited to 'kernel/time/ntp.c')
-rw-r--r-- | kernel/time/ntp.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 6df8927c58a5..05b7391bf9bd 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c @@ -17,6 +17,7 @@ #include <linux/module.h> #include <linux/rtc.h> #include <linux/math64.h> +#include <linux/swork.h> #include "ntp_internal.h" #include "timekeeping_internal.h" @@ -568,10 +569,35 @@ static void sync_cmos_clock(struct work_struct *work) &sync_cmos_work, timespec64_to_jiffies(&next)); } +#ifdef CONFIG_PREEMPT_RT_FULL + +static void run_clock_set_delay(struct swork_event *event) +{ + queue_delayed_work(system_power_efficient_wq, &sync_cmos_work, 0); +} + +static struct swork_event ntp_cmos_swork; + +void ntp_notify_cmos_timer(void) +{ + swork_queue(&ntp_cmos_swork); +} + +static __init int create_cmos_delay_thread(void) +{ + WARN_ON(swork_get()); + INIT_SWORK(&ntp_cmos_swork, run_clock_set_delay); + return 0; +} +early_initcall(create_cmos_delay_thread); + +#else + void ntp_notify_cmos_timer(void) { queue_delayed_work(system_power_efficient_wq, &sync_cmos_work, 0); } +#endif /* CONFIG_PREEMPT_RT_FULL */ #else void ntp_notify_cmos_timer(void) { } |