diff options
author | John Stultz <john.stultz@linaro.org> | 2013-03-22 22:37:28 +0400 |
---|---|---|
committer | John Stultz <john.stultz@linaro.org> | 2013-04-05 00:18:16 +0400 |
commit | 06c017fdd4dc48451a29ac37fc1db4a3f86b7f40 (patch) | |
tree | 3629e95c779bbc388aab162ddaf3d8c37a8b8b48 /kernel/time/timekeeping.c | |
parent | cef90377fab488bd1f959efda178fb83250cf61d (diff) | |
download | linux-06c017fdd4dc48451a29ac37fc1db4a3f86b7f40.tar.xz |
timekeeping: Hold timekeepering locks in do_adjtimex and hardpps
In moving the NTP state to be protected by the timekeeping locks,
be sure to acquire the timekeeping locks prior to calling
ntp functions.
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: Prarit Bhargava <prarit@redhat.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'kernel/time/timekeeping.c')
-rw-r--r-- | kernel/time/timekeeping.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index e44915c7b16c..d10bd734b151 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -787,10 +787,10 @@ void __init timekeeping_init(void) boot.tv_nsec = 0; } - ntp_init(); - raw_spin_lock_irqsave(&timekeeper_lock, flags); write_seqcount_begin(&timekeeper_seq); + ntp_init(); + clock = clocksource_default_clock(); if (clock->enable) clock->enable(clock); @@ -1618,6 +1618,7 @@ EXPORT_SYMBOL_GPL(ktime_get_monotonic_offset); */ int do_adjtimex(struct timex *txc) { + unsigned long flags; struct timespec ts; s32 tai, orig_tai; int ret; @@ -1641,8 +1642,14 @@ int do_adjtimex(struct timex *txc) getnstimeofday(&ts); orig_tai = tai = timekeeping_get_tai_offset(); + raw_spin_lock_irqsave(&timekeeper_lock, flags); + write_seqcount_begin(&timekeeper_seq); + ret = __do_adjtimex(txc, &ts, &tai); + write_seqcount_end(&timekeeper_seq); + raw_spin_unlock_irqrestore(&timekeeper_lock, flags); + if (tai != orig_tai) timekeeping_set_tai_offset(tai); @@ -1655,7 +1662,15 @@ int do_adjtimex(struct timex *txc) */ void hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts) { + unsigned long flags; + + raw_spin_lock_irqsave(&timekeeper_lock, flags); + write_seqcount_begin(&timekeeper_seq); + __hardpps(phase_ts, raw_ts); + + write_seqcount_end(&timekeeper_seq); + raw_spin_unlock_irqrestore(&timekeeper_lock, flags); } EXPORT_SYMBOL(hardpps); #endif |