From: Aubrey Li <aubrey...@linux.intel.com>

Current cpuidle governor updates the last idle residency with the
hardware c-state exit latency, which is not applicable for fast
idle path, so we update idle residency in idle routine instead.
---
 drivers/cpuidle/cpuidle.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
index 2b7d7bf..97aacab 100644
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -306,8 +306,6 @@ static void cpuidle_update(struct cpuidle_driver *drv,
 {
        struct cpuidle_governor_stat *gov_stat =
                (struct cpuidle_governor_stat *)&(dev->gov_stat);
-       int last_idx = gov_stat->last_state_idx;
-       struct cpuidle_state *target = &drv->states[last_idx];
        unsigned int measured_us;
        unsigned int new_factor;
 
@@ -329,12 +327,6 @@ static void cpuidle_update(struct cpuidle_driver *drv,
        /* measured value */
        measured_us = cpuidle_get_last_residency(dev);
 
-       /* Deduct exit latency */
-       if (measured_us > 2 * target->exit_latency)
-               measured_us -= target->exit_latency;
-       else
-               measured_us /= 2;
-
        /* Make sure our coefficients do not exceed unity */
        if (measured_us > gov_stat->next_timer_us)
                measured_us = gov_stat->next_timer_us;
@@ -481,6 +473,11 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct 
cpuidle_driver *drv,
        diff = ktime_us_delta(time_end, time_start);
        if (diff > INT_MAX)
                diff = INT_MAX;
+       else if (diff > 2 * target_state->exit_latency)
+               /* Deduct exit latency */
+               diff -= target_state->exit_latency;
+       else
+               diff /= 2;
 
        dev->last_residency = (int) diff;
 
-- 
2.7.4

Reply via email to