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>
This commit is contained in:
		
							parent
							
								
									cef90377fa
								
							
						
					
					
						commit
						06c017fdd4
					
				| @ -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 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user