mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +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)"
 | 
						int "Clocksource watchdog maximum allowable skew (in μs)"
 | 
				
			||||||
	depends on CLOCKSOURCE_WATCHDOG
 | 
						depends on CLOCKSOURCE_WATCHDOG
 | 
				
			||||||
	range 50 1000
 | 
						range 50 1000
 | 
				
			||||||
	default 100
 | 
						default 125
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  Specify the maximum amount of allowable watchdog skew in
 | 
						  Specify the maximum amount of allowable watchdog skew in
 | 
				
			||||||
	  microseconds before reporting the clocksource to be unstable.
 | 
						  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
 | 
					endmenu
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -95,6 +95,11 @@ static char override_name[CS_NAME_LEN];
 | 
				
			||||||
static int finished_booting;
 | 
					static int finished_booting;
 | 
				
			||||||
static u64 suspend_start;
 | 
					static u64 suspend_start;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Interval: 0.5sec.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define WATCHDOG_INTERVAL (HZ >> 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Threshold: 0.0312s, when doubled: 0.0625s.
 | 
					 * Threshold: 0.0312s, when doubled: 0.0625s.
 | 
				
			||||||
 * Also a default for cs->uncertainty_margin when registering clocks.
 | 
					 * 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.
 | 
					 * clocksource surrounding a read of the clocksource being validated.
 | 
				
			||||||
 * This delay could be due to SMIs, NMIs, or to VCPU preemptions.  Used as
 | 
					 * 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.
 | 
					 * 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
 | 
					#ifdef CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US
 | 
				
			||||||
#define MAX_SKEW_USEC	CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US
 | 
					#define MAX_SKEW_USEC	CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#define MAX_SKEW_USEC	100
 | 
					#define MAX_SKEW_USEC	(125 * WATCHDOG_INTERVAL / HZ)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define WATCHDOG_MAX_SKEW (MAX_SKEW_USEC * NSEC_PER_USEC)
 | 
					#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 int clocksource_watchdog_kthread(void *data);
 | 
				
			||||||
static void __clocksource_change_rating(struct clocksource *cs, int rating);
 | 
					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)
 | 
					static void clocksource_watchdog_work(struct work_struct *work)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue