Quoting Morten Rasmussen (2015-07-07 11:24:27) > From: Juri Lelli <juri.le...@arm.com> > > 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 <mi...@redhat.com> > cc: Peter Zijlstra <pet...@infradead.org> > > Signed-off-by: Juri Lelli <juri.le...@arm.com> > --- > 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 majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/