Commit 8e92b6605da989c0aa8ff7e33306f36f0efd957c

Authored by Venki Pallipadi
Committed by Len Brown
1 parent 8b78cf602f

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>

Showing 2 changed files with 4 additions and 2 deletions Side-by-side Diff

drivers/acpi/processor_idle.c
... ... @@ -1693,7 +1693,9 @@
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;
drivers/cpuidle/cpuidle.c
... ... @@ -224,7 +224,7 @@
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