mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	clocksource: Loosen clocksource watchdog constraints
Currently, MAX_SKEW_USEC is set to 100 microseconds, which has worked reasonably well. However, NTP is willing to tolerate 500 microseconds of skew per second, and a clocksource that is good enough for NTP should be good enough for the clocksource watchdog. The watchdog's skew is controlled by MAX_SKEW_USEC and the CLOCKSOURCE_WATCHDOG_MAX_SKEW_US Kconfig option. However, these values are doubled before being associated with a clocksource's ->uncertainty_margin, and the ->uncertainty_margin values of the pair of clocksource's being compared are summed before checking against the skew. Therefore, set both MAX_SKEW_USEC and the default for the CLOCKSOURCE_WATCHDOG_MAX_SKEW_US Kconfig option to 125 microseconds of skew per second, resulting in 500 microseconds of skew per second in the clocksource watchdog's skew comparison. Suggested-by Rik van Riel <riel@surriel.com> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
		
							parent
							
								
									beaa1ffe55
								
							
						
					
					
						commit
						c37e85c135
					
				
					 2 changed files with 14 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -200,10 +200,14 @@ config CLOCKSOURCE_WATCHDOG_MAX_SKEW_US
 | 
			
		|||
	int "Clocksource watchdog maximum allowable skew (in μs)"
 | 
			
		||||
	depends on CLOCKSOURCE_WATCHDOG
 | 
			
		||||
	range 50 1000
 | 
			
		||||
	default 100
 | 
			
		||||
	default 125
 | 
			
		||||
	help
 | 
			
		||||
	  Specify the maximum amount of allowable watchdog skew in
 | 
			
		||||
	  microseconds before reporting the clocksource to be unstable.
 | 
			
		||||
	  The default is based on a half-second clocksource watchdog
 | 
			
		||||
	  interval and NTP's maximum frequency drift of 500 parts
 | 
			
		||||
	  per million.	If the clocksource is good enough for NTP,
 | 
			
		||||
	  it is good enough for the clocksource watchdog!
 | 
			
		||||
 | 
			
		||||
endmenu
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -95,6 +95,11 @@ static char override_name[CS_NAME_LEN];
 | 
			
		|||
static int finished_booting;
 | 
			
		||||
static u64 suspend_start;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Interval: 0.5sec.
 | 
			
		||||
 */
 | 
			
		||||
#define WATCHDOG_INTERVAL (HZ >> 1)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Threshold: 0.0312s, when doubled: 0.0625s.
 | 
			
		||||
 * Also a default for cs->uncertainty_margin when registering clocks.
 | 
			
		||||
| 
						 | 
				
			
			@ -106,11 +111,14 @@ static u64 suspend_start;
 | 
			
		|||
 * clocksource surrounding a read of the clocksource being validated.
 | 
			
		||||
 * This delay could be due to SMIs, NMIs, or to VCPU preemptions.  Used as
 | 
			
		||||
 * a lower bound for cs->uncertainty_margin values when registering clocks.
 | 
			
		||||
 *
 | 
			
		||||
 * The default of 500 parts per million is based on NTP's limits.
 | 
			
		||||
 * If a clocksource is good enough for NTP, it is good enough for us!
 | 
			
		||||
 */
 | 
			
		||||
#ifdef CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US
 | 
			
		||||
#define MAX_SKEW_USEC	CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US
 | 
			
		||||
#else
 | 
			
		||||
#define MAX_SKEW_USEC	100
 | 
			
		||||
#define MAX_SKEW_USEC	(125 * WATCHDOG_INTERVAL / HZ)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define WATCHDOG_MAX_SKEW (MAX_SKEW_USEC * NSEC_PER_USEC)
 | 
			
		||||
| 
						 | 
				
			
			@ -140,11 +148,6 @@ static inline void clocksource_watchdog_unlock(unsigned long *flags)
 | 
			
		|||
static int clocksource_watchdog_kthread(void *data);
 | 
			
		||||
static void __clocksource_change_rating(struct clocksource *cs, int rating);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Interval: 0.5sec.
 | 
			
		||||
 */
 | 
			
		||||
#define WATCHDOG_INTERVAL (HZ >> 1)
 | 
			
		||||
 | 
			
		||||
static void clocksource_watchdog_work(struct work_struct *work)
 | 
			
		||||
{
 | 
			
		||||
	/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue