Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

cpuidle: fix 100% C0 statistics regression

commit 9b12e18cdc1553de62d931e73443c806347cd974
'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>

authored by

Venki Pallipadi and committed by
Len Brown
8e92b660 8b78cf60

+4 -2
+3 -1
drivers/acpi/processor_idle.c
··· 1693 1693 switch (cx->type) { 1694 1694 case ACPI_STATE_C1: 1695 1695 state->flags |= CPUIDLE_FLAG_SHALLOW; 1696 - state->flags |= CPUIDLE_FLAG_TIME_VALID; 1696 + if (cx->entry_method == ACPI_CSTATE_FFH) 1697 + state->flags |= CPUIDLE_FLAG_TIME_VALID; 1698 + 1697 1699 state->enter = acpi_idle_enter_c1; 1698 1700 dev->safe_state = state; 1699 1701 break;
+1 -1
drivers/cpuidle/cpuidle.c
··· 224 224 state->exit_latency = 0; 225 225 state->target_residency = 0; 226 226 state->power_usage = -1; 227 - state->flags = CPUIDLE_FLAG_POLL | CPUIDLE_FLAG_TIME_VALID; 227 + state->flags = CPUIDLE_FLAG_POLL; 228 228 state->enter = poll_idle; 229 229 } 230 230 #else