diff options
-rw-r--r-- | drivers/cpuidle/cpuidle.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index d75040ddd2b3..7b6553b049cd 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c @@ -19,6 +19,7 @@ #include <linux/ktime.h> #include <linux/hrtimer.h> #include <linux/module.h> +#include <linux/sched.h> #include <trace/events/power.h> #include "cpuidle.h" @@ -42,6 +43,12 @@ void disable_cpuidle(void) off = 1; } +static void cpuidle_set_current_state(int cpu, int latency) +{ + struct sched_pm *stat = &per_cpu(sched_stat, cpu); + + atomic_set(&(stat->wake_latency), latency); +} /** * cpuidle_play_dead - cpu off-lining * @@ -79,12 +86,16 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv, ktime_t time_start, time_end; s64 diff; + cpuidle_set_current_state(dev->cpu, target_state->exit_latency); + time_start = ktime_get(); entered_state = target_state->enter(dev, drv, index); time_end = ktime_get(); + cpuidle_set_current_state(dev->cpu, 0); + local_irq_enable(); diff = ktime_to_us(ktime_sub(time_end, time_start)); |