diff options
| author | John Stultz <john.stultz@linaro.org> | 2013-03-22 11:37:28 -0700 | 
|---|---|---|
| committer | John Stultz <john.stultz@linaro.org> | 2013-04-04 13:18:16 -0700 | 
| commit | 06c017fdd4dc48451a29ac37fc1db4a3f86b7f40 (patch) | |
| tree | 3629e95c779bbc388aab162ddaf3d8c37a8b8b48 | |
| parent | cef90377fab488bd1f959efda178fb83250cf61d (diff) | |
| download | olio-linux-3.10-06c017fdd4dc48451a29ac37fc1db4a3f86b7f40.tar.xz olio-linux-3.10-06c017fdd4dc48451a29ac37fc1db4a3f86b7f40.zip | |
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>
| -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 e44915c7b16..d10bd734b15 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 |