mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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
					
				
					 1 changed files with 17 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -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 a new issue