| From trenn@suse.de Tue Feb 3 14:54:29 2009 |
| From: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> |
| Date: Tue, 27 Jan 2009 17:38:45 +0100 |
| Subject: cpuidle: use last_state which can reflect the actual state entered |
| To: stable@kernel.org |
| Cc: Len Brown <len.brown@intel.com>, Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> |
| Message-ID: <1233074343-23414-4-git-send-email-trenn@suse.de> |
| |
| |
| From: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> |
| |
| commit 887e301aa1105326f1412a98749024263b1031c7 upstream |
| |
| cpuidle accounts the idle time for the C-state it was trying to enter and |
| not to the actual state that the driver eventually entered. The driver may |
| select a different state than the one chosen by cpuidle due to |
| constraints like bus-mastering, etc. |
| |
| Change the time acounting code to look at the dev->last_state after |
| returning from target_state->enter(). Driver can modify dev->last_state |
| internally, inside the enter routine to reflect the actual C-state |
| entered. |
| |
| Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> |
| Tested-by: Kevin Hilman <khilman@deeprootsystems.com> |
| Signed-off-by: Len Brown <len.brown@intel.com> |
| Cc: Thomas Renninger <trenn@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/cpuidle/cpuidle.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/cpuidle/cpuidle.c |
| +++ b/drivers/cpuidle/cpuidle.c |
| @@ -71,8 +71,11 @@ static void cpuidle_idle_call(void) |
| target_state = &dev->states[next_state]; |
| |
| /* enter the state and update stats */ |
| - dev->last_residency = target_state->enter(dev, target_state); |
| dev->last_state = target_state; |
| + dev->last_residency = target_state->enter(dev, target_state); |
| + if (dev->last_state) |
| + target_state = dev->last_state; |
| + |
| target_state->time += (unsigned long long)dev->last_residency; |
| target_state->usage++; |
| |