ACPI: Don't let acpi_pad needlessly mark TSC unstable
acpi pad driver kind of aggressively marks TSC as unstable at init time, on mwait capable and non X86_FEATURE_NONSTOP_TSC systems. This is irrespective of whether pad driver is ever going to be used on the system or deep C-states are supported/used. This will affect every user who just happens to compile in (or get a kernel version which compiles in) acpi pad driver. Move mark_tsc_unstable() out of init to the actual idle invocation path of the pad driver. There is also another bug/missing_feature in the code that it does not support 'always running apic timer' and switches to broadcast mode unconditionally. Shaohua, can you take a look at that please. Signed-off-by: Venkatesh Pallipadi <venki@google.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
		
					parent
					
						
							
								b6fecaa868
							
						
					
				
			
			
				commit
				
					
						0dc698b93f
					
				
			
		
					 1 changed files with 11 additions and 2 deletions
				
			
		|  | @ -43,6 +43,10 @@ static DEFINE_MUTEX(isolated_cpus_lock); | ||||||
| #define CPUID5_ECX_EXTENSIONS_SUPPORTED (0x1) | #define CPUID5_ECX_EXTENSIONS_SUPPORTED (0x1) | ||||||
| #define CPUID5_ECX_INTERRUPT_BREAK	(0x2) | #define CPUID5_ECX_INTERRUPT_BREAK	(0x2) | ||||||
| static unsigned long power_saving_mwait_eax; | static unsigned long power_saving_mwait_eax; | ||||||
|  | 
 | ||||||
|  | static unsigned char tsc_detected_unstable; | ||||||
|  | static unsigned char tsc_marked_unstable; | ||||||
|  | 
 | ||||||
| static void power_saving_mwait_init(void) | static void power_saving_mwait_init(void) | ||||||
| { | { | ||||||
| 	unsigned int eax, ebx, ecx, edx; | 	unsigned int eax, ebx, ecx, edx; | ||||||
|  | @ -87,8 +91,8 @@ static void power_saving_mwait_init(void) | ||||||
| 
 | 
 | ||||||
| 		/*FALL THROUGH*/ | 		/*FALL THROUGH*/ | ||||||
| 	default: | 	default: | ||||||
| 		/* TSC could halt in idle, so notify users */ | 		/* TSC could halt in idle */ | ||||||
| 		mark_tsc_unstable("TSC halts in idle"); | 		tsc_detected_unstable = 1; | ||||||
| 	} | 	} | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  | @ -178,6 +182,11 @@ static int power_saving_thread(void *data) | ||||||
| 		expire_time = jiffies + HZ * (100 - idle_pct) / 100; | 		expire_time = jiffies + HZ * (100 - idle_pct) / 100; | ||||||
| 
 | 
 | ||||||
| 		while (!need_resched()) { | 		while (!need_resched()) { | ||||||
|  | 			if (tsc_detected_unstable && !tsc_marked_unstable) { | ||||||
|  | 				/* TSC could halt in idle, so notify users */ | ||||||
|  | 				mark_tsc_unstable("TSC halts in idle"); | ||||||
|  | 				tsc_marked_unstable = 1; | ||||||
|  | 			} | ||||||
| 			local_irq_disable(); | 			local_irq_disable(); | ||||||
| 			cpu = smp_processor_id(); | 			cpu = smp_processor_id(); | ||||||
| 			clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, | 			clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Venkatesh Pallipadi
				Venkatesh Pallipadi