aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuri Lelli <juri.lelli@arm.com>2015-07-07 19:24:27 +0100
committerVincent Guittot <vincent.guittot@linaro.org>2015-07-27 17:59:44 +0200
commit1f8320d08297a16bf160004bb0bd6ebca9ae9583 (patch)
treee3a30d67c381e9c6dac722fb2c31f64c85cf663d
parentfca56afd0ca202619a004c8480f4b6d9787a217e (diff)
sched/fair: jump to max OPP when crossing UP threshold
Since the true utilization of a long running task is not detectable while it is running and might be bigger than the current cpu capacity, create the maximum cpu capacity head room by requesting the maximum cpu capacity once the cpu usage plus the capacity margin exceeds the current capacity. This is also done to try to harm the performance of a task the least. cc: Ingo Molnar <mingo@redhat.com> cc: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Juri Lelli <juri.lelli@arm.com>
-rw-r--r--kernel/sched/fair.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index a8ee44a750c6..01746ba25fba 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -8571,6 +8571,25 @@ static void task_tick_fair(struct rq *rq, struct task_struct *curr, int queued)
if (!rq->rd->overutilized && cpu_overutilized(task_cpu(curr)))
rq->rd->overutilized = true;
+
+ /*
+ * To make free room for a task that is building up its "real"
+ * utilization and to harm its performance the least, request a
+ * jump to max OPP as soon as get_cpu_usage() crosses the UP
+ * threshold. The UP threshold is built relative to the current
+ * capacity (OPP), by using same margin used to tell if a cpu
+ * is overutilized (capacity_margin).
+ */
+ if (sched_energy_freq()) {
+ int cpu = cpu_of(rq);
+ unsigned long capacity_orig = capacity_orig_of(cpu);
+ unsigned long capacity_curr = capacity_curr_of(cpu);
+
+ if (capacity_curr < capacity_orig &&
+ (capacity_curr * SCHED_LOAD_SCALE) <
+ (get_cpu_usage(cpu) * capacity_margin))
+ cpufreq_sched_set_cap(cpu, capacity_orig);
+ }
}
/*