From: Quentin Perret <qperret@google.com>
To: Valentin Schneider <valentin.schneider@arm.com>
Cc: linux-kernel@vger.kernel.org, peterz@infradead.org,
mingo@kernel.org, vincent.guittot@linaro.org,
dietmar.eggemann@arm.com, patrick.bellasi@matbug.net,
qais.yousef@arm.com, morten.rasmussen@arm.com
Subject: Re: [PATCH 3/3] sched/fair: Consider uclamp for "task fits capacity" checks
Date: Thu, 21 Nov 2019 15:30:29 +0000 [thread overview]
Message-ID: <20191121153029.GA105938@google.com> (raw)
In-Reply-To: <09e234a2-ea65-4d09-5215-9b0fe4ec09fe@arm.com>
On Thursday 21 Nov 2019 at 14:51:06 (+0000), Valentin Schneider wrote:
> On 21/11/2019 13:30, Quentin Perret wrote:
> > On Thursday 21 Nov 2019 at 12:56:39 (+0000), Valentin Schneider wrote:
> >>> @@ -6274,6 +6274,15 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu)
> >>> if (!fits_capacity(util, cpu_cap))
> >>> continue;
> >>>
> >>> + /*
> >>> + * Skip CPUs that don't satisfy uclamp requests. Note
> >>> + * that the above already ensures the CPU has enough
> >>> + * spare capacity for the task; this is only really for
> >>> + * uclamp restrictions.
> >>> + */
> >>> + if (!task_fits_capacity(p, capacity_orig_of(cpu)))
> >>> + continue;
> >>
> >> This is partly redundant with the above, I think. What we really want here
> >> is just
> >>
> >> fits_capacity(uclamp_eff_value(p, UCLAMP_MIN), capacity_orig_of(cpu))
> >>
> >> but this would require some inline #ifdeffery.
> >
> > This suggested change lacks the UCLAMP_MAX part, which is a shame
> > because this is precisely in the EAS path that we should try and
> > down-migrate tasks if they have an appropriate max_clamp. So, your first
> > proposal made sense, IMO.
> >
>
> Hm right, had to let that spin in my head for a while but I think I got it.
>
> I was only really thinking of:
>
> (h960: LITTLE = 462 cap, big = 1024)
> p.uclamp.min = 512 -> skip LITTLEs regardless of the actual util_est
>
> but your point is we also want stuff like:
>
> p.uclamp.max = 300 -> accept LITTLEs regardless of the actual util_est
Right, sorry if my message wasn't clear.
> I'll keep the feec() change as-is and add something like the above in the
> changelog for v2.
>
> > Another option to avoid the redundancy would be to do something along
> > the lines of the totally untested diff below.
> >
> > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> > index 69a81a5709ff..38cb5fe7ba65 100644
> > --- a/kernel/sched/fair.c
> > +++ b/kernel/sched/fair.c
> > @@ -6372,9 +6372,12 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu)
> > if (!cpumask_test_cpu(cpu, p->cpus_ptr))
> > continue;
> >
> > - /* Skip CPUs that will be overutilized. */
> > util = cpu_util_next(cpu, p, cpu);
> > cpu_cap = capacity_of(cpu);
> > + spare_cap = cpu_cap - util;
> > + util = uclamp_util_with(cpu_rq(cpu), util, p);
> > +
> > + /* Skip CPUs that will be overutilized. */
> > if (!fits_capacity(util, cpu_cap))
> > continue;
> >
> > @@ -6389,7 +6392,6 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu)
> > * Find the CPU with the maximum spare capacity in
> > * the performance domain
> > */
> > - spare_cap = cpu_cap - util;
> > if (spare_cap > max_spare_cap) {
> > max_spare_cap = spare_cap;
> > max_spare_cap_cpu = cpu;
> >
> > Thoughts ?
> >
>
> uclamp_util_with() (or uclamp_rq_util_with() ;)) picks the max between the
> rq-aggregated clamps and the task clamps, which isn't what we want. If the
> task has a low-ish uclamp.max (e.g. the 300 example from above) but the
> rq-wide max-aggregated uclamp.max is ~800, we'd clamp using that 800. It
> makes sense for frequency selection, but not for task placement IMO.
Right, but you could argue that this is in fact a correct behaviour.
What we want to know is 'is this CPU big enough to meet the capacity
request if I enqueue p there ?'. And the 'capacity request' is the
aggregated rq-wide clamped util, IMO.
If enqueuing 'p' on a given CPU will cause the rq-wide clamped util to
go above the CPU capacity, we want to skip that CPU.
The obvious case is if p's min_clamp is larger than the CPU capacity.
But similarly, if p's max_clamp is going to be ignored because of
another task with a larger max_clamp on the same rq, this is relevant
information too -- the resulting capacity request might be above the
CPU capacity if p's util_avg is large, so we should probably skip the
CPU too no ?
Are we gaining anything if we decide to not align the EAS path and the
sugov path ?
Thanks,
Quentin
next prev parent reply other threads:[~2019-11-21 15:30 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-20 17:55 [PATCH 0/3] sched/fair: Task placement biasing using uclamp Valentin Schneider
2019-11-20 17:55 ` [PATCH 1/3] sched/uclamp: Make uclamp_util_*() helpers use and return UL values Valentin Schneider
2019-11-20 17:55 ` [PATCH 2/3] sched/uclamp: Rename uclamp_util_*() into uclamp_rq_util_*() Valentin Schneider
2019-11-20 17:55 ` [PATCH 3/3] sched/fair: Consider uclamp for "task fits capacity" checks Valentin Schneider
2019-11-21 11:56 ` Quentin Perret
2019-11-21 12:56 ` Valentin Schneider
2019-11-21 13:30 ` Quentin Perret
2019-11-21 14:51 ` Valentin Schneider
2019-11-21 15:30 ` Quentin Perret [this message]
2019-11-21 17:22 ` Valentin Schneider
2019-11-24 22:20 ` Qais Yousef
2019-11-25 17:33 ` Valentin Schneider
2019-11-26 10:06 ` Qais Yousef
2019-11-21 12:00 ` [PATCH 0/3] sched/fair: Task placement biasing using uclamp Quentin Perret
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191121153029.GA105938@google.com \
--to=qperret@google.com \
--cc=dietmar.eggemann@arm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=morten.rasmussen@arm.com \
--cc=patrick.bellasi@matbug.net \
--cc=peterz@infradead.org \
--cc=qais.yousef@arm.com \
--cc=valentin.schneider@arm.com \
--cc=vincent.guittot@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.