cpuidle: Use actual state latency in menu governor
authortuukka.tikkanen@linaro.org <tuukka.tikkanen@linaro.org>
Mon, 24 Feb 2014 06:29:32 +0000 (08:29 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 6 Mar 2014 00:45:58 +0000 (01:45 +0100)
Currently menu governor records the exit latency of the state it has
chosen for the idle period. The stored latency value is then later
used to calculate the actual length of the idle period. This value
may however be incorrect, as the entered state may not be the one
chosen by the governor. The entered state information is available,
so we can use that to obtain the real exit latency.

Signed-off-by: Tuukka Tikkanen <tuukka.tikkanen@linaro.org>
Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpuidle/governors/menu.c

index e9a2a27134c1a733fe78109a3db007554c9a5e51..115386a46e9ecfc8dea1184888a4f4a28132e9c8 100644 (file)
@@ -124,7 +124,6 @@ struct menu_device {
 
        unsigned int    next_timer_us;
        unsigned int    predicted_us;
-       unsigned int    exit_us;
        unsigned int    bucket;
        unsigned int    correction_factor[BUCKETS];
        unsigned int    intervals[INTERVALS];
@@ -298,7 +297,6 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
        }
 
        data->last_state_idx = 0;
-       data->exit_us = 0;
 
        /* Special case when user has set very strict latency requirement */
        if (unlikely(latency_req == 0))
@@ -359,7 +357,6 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
                        continue;
 
                data->last_state_idx = i;
-               data->exit_us = s->exit_latency;
        }
 
        return data->last_state_idx;
@@ -410,8 +407,8 @@ static void menu_update(struct cpuidle_driver *drv, struct cpuidle_device *dev)
         * We correct for the exit latency; we are assuming here that the
         * exit latency happens after the event that we're interested in.
         */
-       if (measured_us > data->exit_us)
-               measured_us -= data->exit_us;
+       if (measured_us > target->exit_latency)
+               measured_us -= target->exit_latency;
 
 
        /* Update our correction ratio */