aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormyfluxi <linflux@arcor.de>2014-07-19 00:30:20 +0200
committermyfluxi <linflux@arcor.de>2015-04-26 14:31:00 +0200
commitc22bb66c16d3150aa56cb7f5c54f6e42c76701f5 (patch)
tree3b0c1e0ef42f706900b1d1bbbca3a775bd368246
parent0e5985ce7fb2589863e2164a47fa68f884026e37 (diff)
cpufreq: interactive: Honor boosted state in several timer calculations
Change-Id: If03da12c52d89a5293e32ac918db44a00ef34884
-rw-r--r--drivers/cpufreq/cpufreq_interactive.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c
index fc05bf96f25..d39832f0732 100644
--- a/drivers/cpufreq/cpufreq_interactive.c
+++ b/drivers/cpufreq/cpufreq_interactive.c
@@ -140,6 +140,7 @@ static void cpufreq_interactive_timer_resched(unsigned long cpu)
struct cpufreq_interactive_cpuinfo *pcpu = &per_cpu(cpuinfo, cpu);
u64 expires;
unsigned long flags;
+ u64 now = ktime_to_us(ktime_get());
spin_lock_irqsave(&pcpu->load_lock, flags);
pcpu->time_in_idle =
@@ -152,7 +153,10 @@ static void cpufreq_interactive_timer_resched(unsigned long cpu)
pcpu->cpu_timer.expires = expires;
add_timer_on(&pcpu->cpu_timer, cpu);
- if (timer_slack_val >= 0 && pcpu->target_freq > pcpu->policy->min) {
+ if (timer_slack_val >= 0 &&
+ (pcpu->target_freq > pcpu->policy->min ||
+ (pcpu->target_freq == pcpu->policy->min &&
+ now < boostpulse_endtime))) {
expires += usecs_to_jiffies(timer_slack_val);
del_timer(&pcpu->cpu_slack_timer);
pcpu->cpu_slack_timer.expires = expires;
@@ -171,11 +175,15 @@ static void cpufreq_interactive_timer_start(int cpu)
struct cpufreq_interactive_cpuinfo *pcpu = &per_cpu(cpuinfo, cpu);
u64 expires = round_to_nw_start(pcpu->last_evaluated_jiffy);
unsigned long flags;
+ u64 now = ktime_to_us(ktime_get());
spin_lock_irqsave(&pcpu->load_lock, flags);
pcpu->cpu_timer.expires = expires;
add_timer_on(&pcpu->cpu_timer, cpu);
- if (timer_slack_val >= 0 && pcpu->target_freq > pcpu->policy->min) {
+ if (timer_slack_val >= 0 &&
+ (pcpu->target_freq > pcpu->policy->min ||
+ (pcpu->target_freq == pcpu->policy->min &&
+ now < boostpulse_endtime))) {
expires += usecs_to_jiffies(timer_slack_val);
pcpu->cpu_slack_timer.expires = expires;
add_timer_on(&pcpu->cpu_slack_timer, cpu);
@@ -497,9 +505,12 @@ static void cpufreq_interactive_idle_start(void)
return;
}
+ now = ktime_to_us(ktime_get());
pending = timer_pending(&pcpu->cpu_timer);
- if (pcpu->target_freq != pcpu->policy->min) {
+ if (pcpu->target_freq > pcpu->policy->min ||
+ (pcpu->target_freq == pcpu->policy->min &&
+ now < boostpulse_endtime)) {
/*
* Entering idle while not at lowest speed. On some
* platforms this can hold the other CPU(s) at that speed