[linux-pm] [patch 1/2] cpuidle: use last_state which can reflect the actual state entered
Pallipadi, Venkatesh
venkatesh.pallipadi at intel.com
Wed Oct 8 10:54:59 PDT 2008
>-----Original Message-----
>From: Kevin Hilman [mailto:khilman at deeprootsystems.com]
>Sent: Wednesday, October 01, 2008 4:09 AM
>To: Pallipadi, Venkatesh
>Cc: lenb at kernel.org; linux-pm at lists.linux-foundation.org
>Subject: Re: [linux-pm] [patch 1/2] cpuidle: use last_state
>which can reflect the actual state entered
>
>Venkatesh Pallipadi <venkatesh.pallipadi at intel.com> writes:
>
>> 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 at intel.com>
>>
>> ---
>> drivers/cpuidle/cpuidle.c | 5 ++++-
>> 1 file changed, 4 insertions(+), 1 deletion(-)
>>
>> Index: tip/drivers/cpuidle/cpuidle.c
>> ===================================================================
>> --- tip.orig/drivers/cpuidle/cpuidle.c 2008-09-23
>13:52:59.000000000 -0700
>> +++ tip/drivers/cpuidle/cpuidle.c 2008-09-23
>14:22:43.000000000 -0700
>> @@ -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++;
>
>Under what conditions would the enter hook set dev->last_sate to NULL?
>Having the check seems to indicate it's possilble.
Sorry about the delayed response.
Yes. I added the check after finding out that last_state can be possibly NULL.
That happens when the governor changes while one core is in idle and also during
CPU offline/online.
>A minor nit-pick... why not explicitly do the accounting using
>'last_state' like below. While functionally the same as above, this
>makes it makes it more explicit when reading the code that the
>accounting is done using 'last_state' and not 'target_state.'
>
Yes. It is cleaner. But, we still have to check for last_state being NULL.
>
>
>diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
>index 5ce07b5..c1294f5 100644
>--- a/drivers/cpuidle/cpuidle.c
>+++ b/drivers/cpuidle/cpuidle.c
>@@ -67,10 +67,10 @@ 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;
>- target_state->time += (unsigned long long)dev->last_residency;
>- target_state->usage++;
>+ dev->last_residency = target_state->enter(dev, target_state);
>+ dev->last_state->time += (unsigned long
>long)dev->last_residency;
>+ dev->last_state->usage++;
>
> /* give the governor an opportunity to reflect on the
>outcome */
> if (cpuidle_curr_governor->reflect)
>
Thanks,
Venki
More information about the linux-pm
mailing list