Message ID | 20171205171018.9203-5-patrick.bellasi@arm.com (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers | show |
On Tuesday, December 5, 2017 6:10:18 PM CET Patrick Bellasi wrote: > When schedutil looks at the CPU utilization, the current PELT value for > that CPU is returned straight away. In certain scenarios this can have > undesired side effects and delays on frequency selection. > > For example, since the task utilization is decayed at wakeup time, a > long sleeping big task newly enqueued does not add immediately a > significant contribution to the target CPU. This introduces some latency > before schedutil will be able to detect the best frequency required by > that task. > > Moreover, the PELT signal build-up time is function of the current > frequency, because of the scale invariant load tracking support. Thus, > starting from a lower frequency, the utilization build-up time will > increase even more and further delays the selection of the actual > frequency which better serves the task requirements. > > In order to reduce these kind of latencies, this patch integrates the > usage of the CPU's estimated utilization in the sugov_get_util function. > > The estimated utilization of a CPU is defined to be the maximum between > its PELT's utilization and the sum of the estimated utilization of each > currently RUNNABLE task on that CPU. > This allows to properly represent the expected utilization of a CPU which, > for example, has just got a big task running after a long sleep period, > and ultimately it allows to select the best frequency to run a task > right after it wakes up. > > Signed-off-by: Patrick Bellasi <patrick.bellasi@arm.com> > Reviewed-by: Brendan Jackman <brendan.jackman@arm.com> > Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com> > Cc: Ingo Molnar <mingo@redhat.com> > Cc: Peter Zijlstra <peterz@infradead.org> > Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > Cc: Viresh Kumar <viresh.kumar@linaro.org> > Cc: Paul Turner <pjt@google.com> > Cc: Vincent Guittot <vincent.guittot@linaro.org> > Cc: Morten Rasmussen <morten.rasmussen@arm.com> > Cc: Dietmar Eggemann <dietmar.eggemann@arm.com> > Cc: linux-kernel@vger.kernel.org > Cc: linux-pm@vger.kernel.org > > --- > Changes v1->v2: > - rebase on top of v4.15-rc2 > - tested that overhauled PELT code does not affect the util_est > --- > kernel/sched/cpufreq_schedutil.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c > index 2f52ec0f1539..465430d99440 100644 > --- a/kernel/sched/cpufreq_schedutil.c > +++ b/kernel/sched/cpufreq_schedutil.c > @@ -183,7 +183,11 @@ static void sugov_get_util(unsigned long *util, unsigned long *max, int cpu) > > cfs_max = arch_scale_cpu_capacity(NULL, cpu); > > - *util = min(rq->cfs.avg.util_avg, cfs_max); > + *util = rq->cfs.avg.util_avg; I would use a local variable here. That *util everywhere looks a bit dirtyish. > + if (sched_feat(UTIL_EST)) > + *util = max(*util, rq->cfs.util_est_runnable); > + *util = min(*util, cfs_max); > + > *max = cfs_max; > } > >
Hi Rafael, On 16-Dec 03:35, Rafael J. Wysocki wrote: > On Tuesday, December 5, 2017 6:10:18 PM CET Patrick Bellasi wrote: [...] > > diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c > > index 2f52ec0f1539..465430d99440 100644 > > --- a/kernel/sched/cpufreq_schedutil.c > > +++ b/kernel/sched/cpufreq_schedutil.c > > @@ -183,7 +183,11 @@ static void sugov_get_util(unsigned long *util, unsigned long *max, int cpu) > > > > cfs_max = arch_scale_cpu_capacity(NULL, cpu); > > > > - *util = min(rq->cfs.avg.util_avg, cfs_max); > > + *util = rq->cfs.avg.util_avg; > > I would use a local variable here. > > That *util everywhere looks a bit dirtyish. Yes, right... will update for the next respin. > > > + if (sched_feat(UTIL_EST)) > > + *util = max(*util, rq->cfs.util_est_runnable); > > + *util = min(*util, cfs_max); > > + > > *max = cfs_max; > > } > > > > Cheers Patrick
diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index 2f52ec0f1539..465430d99440 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -183,7 +183,11 @@ static void sugov_get_util(unsigned long *util, unsigned long *max, int cpu) cfs_max = arch_scale_cpu_capacity(NULL, cpu); - *util = min(rq->cfs.avg.util_avg, cfs_max); + *util = rq->cfs.avg.util_avg; + if (sched_feat(UTIL_EST)) + *util = max(*util, rq->cfs.util_est_runnable); + *util = min(*util, cfs_max); + *max = cfs_max; }