Re: [RFCv5 PATCH 44/46] sched/fair: jump to max OPP when crossing UP threshold
From: Michael Turquette <mturquette@baylibre.com>
Date: 2015-07-08 16:48:09
Also in:
lkml
Quoting Morten Rasmussen (2015-07-07 11:24:27)
quoted hunk ↗ jump to hunk
From: Juri Lelli <redacted> 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 <redacted> --- kernel/sched/fair.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 323331f..c2d6de4 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c@@ -8586,6 +8586,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);
I'm sure that at some point the Product People are going to want to tune the capacity value that is requested. Hard-coding the max capacity/frequency in is a reasonable start, but at some point it would be nice to fetch an intermediate capacity defined by the cpufreq driver for this particular cpu. We have already seen that a lot in Android devices using the interactive governor and it could be done from cpufreq_sched_start(). Regards, Mike
+ } } /* -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html