mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	cpuidle: fix 100% C0 statistics regression
commit 9b12e18cdc
'ACPI: cpuidle: Support C1 idle time accounting'
was implicated in a 100% C0 idle regression.
http://bugzilla.kernel.org/show_bug.cgi?id=10076
It pointed out a potential problem where the menu governor
may get confused by the C-state residency time from poll
idle or C1 idle, where this timing info is not accurate.
This inaccuracy is due to interrupts being handled
before we account for C-state exit.
Do not mark TIME_VALID for CO poll state.
Mark C1 time as valid only with the MWAIT (CSTATE_FFH) entry method.
This makes governors use the timing information only when it is correct and
eliminates any wrong policy decisions that may result from invalid timing
information.
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
			
			
This commit is contained in:
		
							parent
							
								
									8b78cf602f
								
							
						
					
					
						commit
						8e92b6605d
					
				
					 2 changed files with 4 additions and 2 deletions
				
			
		| 
						 | 
					@ -1693,7 +1693,9 @@ static int acpi_processor_setup_cpuidle(struct acpi_processor *pr)
 | 
				
			||||||
		switch (cx->type) {
 | 
							switch (cx->type) {
 | 
				
			||||||
			case ACPI_STATE_C1:
 | 
								case ACPI_STATE_C1:
 | 
				
			||||||
			state->flags |= CPUIDLE_FLAG_SHALLOW;
 | 
								state->flags |= CPUIDLE_FLAG_SHALLOW;
 | 
				
			||||||
			state->flags |= CPUIDLE_FLAG_TIME_VALID;
 | 
								if (cx->entry_method == ACPI_CSTATE_FFH)
 | 
				
			||||||
 | 
									state->flags |= CPUIDLE_FLAG_TIME_VALID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			state->enter = acpi_idle_enter_c1;
 | 
								state->enter = acpi_idle_enter_c1;
 | 
				
			||||||
			dev->safe_state = state;
 | 
								dev->safe_state = state;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -224,7 +224,7 @@ static void poll_idle_init(struct cpuidle_device *dev)
 | 
				
			||||||
	state->exit_latency = 0;
 | 
						state->exit_latency = 0;
 | 
				
			||||||
	state->target_residency = 0;
 | 
						state->target_residency = 0;
 | 
				
			||||||
	state->power_usage = -1;
 | 
						state->power_usage = -1;
 | 
				
			||||||
	state->flags = CPUIDLE_FLAG_POLL | CPUIDLE_FLAG_TIME_VALID;
 | 
						state->flags = CPUIDLE_FLAG_POLL;
 | 
				
			||||||
	state->enter = poll_idle;
 | 
						state->enter = poll_idle;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue