From: Tim Chen <tim.c.chen@linux.intel.com>
To: Vincent Guittot <vincent.guittot@linaro.org>,
mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com,
dietmar.eggemann@arm.com, rostedt@goodmis.org,
bsegall@google.com, mgorman@suse.de, vschneid@redhat.com,
kprateek.nayak@amd.com, linux-kernel@vger.kernel.org,
lukasz.luba@arm.com, rafael@kernel.org,
linux-pm@vger.kernel.org, tj@kernel.org, void@manifault.com,
arighi@nvidia.com, changwoo@igalia.com,
sched-ext@lists.linux.dev
Cc: qyousef@layalina.io, christian.loehle@arm.com,
pierre.gondois@arm.com, sshegde@linux.ibm.com
Subject: Re: [PATCH 18/18 v2] sched/fair: Take into account slice in EAS
Date: Thu, 08 Oct 2026 15:53:12 -0700 [thread overview]
Message-ID: <179bcb50be21f834423f9b5c068b5fce4cb65871.camel@linux.intel.com> (raw)
In-Reply-To: <20261002154415.2270586-19-vincent.guittot@linaro.org>
On Fri, 2026-10-02 at 17:44 +0200, Vincent Guittot wrote:
> When the cost is the same, take into account the slice of a task to try to
> select a CPU where is will run first.
>
> Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
> ---
> kernel/sched/fair.c | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 94554f165f42..d60bb6db4ce9 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -9598,8 +9598,17 @@ static int check_cpu_with_task(struct task_struct *p, int cpu)
> */
> static bool update_best_cpu(struct energy_cpu_stat *target,
> struct energy_cpu_stat *min,
> - int prev, struct sched_domain *sd)
> + int prev, struct sched_domain *sd,
> + struct task_struct *p)
> {
> + unsigned long task_slice = p->se.slice;
> +
> + /* Select the one where you can run first */
> + if (task_slice < get_rq_min_slice(cpu_rq(target->cpu)) &&
> + task_slice >= get_rq_min_slice(cpu_rq(min->cpu)))
> + return true;
> +
> + /* Favor previous CPU */
> if (target->cpu == prev)
> return true;
Hi Vincent,
The slice check above comes before "Favor previous CPU", so I read the intent
as: the CPU where the task can run first wins, even
against prev_cpu. But the slice check can fail for prev CPU
and we can skip to "Favor previous CPU" and pick prev CPU, even
though the task can run on min CPU first but not
necessarily on prev CPU first.
Take an idle CPU X and a busy prev_cpu. Any task can
run first on X, because an empty rq has min_slice == ULONG_MAX:
- prev_cpu scanned first: when X is the target, the slice check
selects X.
- X scanned first: when prev_cpu is the target, the slice check fails,
and "Favor previous CPU" then selects prev_cpu.
In the second case the task is stacked on the busy prev_cpu even though
it may not run first there.
Perhaps something like the following is better.
---
kernel/sched/fair.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index a47c6521a411..3fe305d690eb 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -9830,11 +9830,15 @@ static bool update_best_cpu(struct energy_cpu_stat *target,
struct task_struct *p)
{
unsigned long task_slice = p->se.slice;
+ bool target_first = task_slice < get_rq_min_slice(cpu_rq(target->cpu));
+ bool min_first = task_slice < get_rq_min_slice(cpu_rq(min->cpu));
- /* Select the one where you can run first */
- if (task_slice < get_rq_min_slice(cpu_rq(target->cpu)) &&
- task_slice >= get_rq_min_slice(cpu_rq(min->cpu)))
- return true;
+ /*
+ * Select the one where you can run first. Check both ways, or the
+ * result depends on the order of the CPUs in the PD.
+ */
+ if (target_first != min_first)
+ return target_first;
/* Favor previous CPU */
if (target->cpu == prev)
Tim
> if (min->cpu == prev)
> @@ -9762,7 +9771,7 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu)
> */
> if (target_perf < min_stat.min_perf)
> find_pd_cost(pd->em_pd, target_perf, &target_stat);
> - else if (!update_best_cpu(&target_stat, &min_stat, prev_cpu, sd))
> + else if (!update_best_cpu(&target_stat, &min_stat, prev_cpu, sd, p))
> continue;
>
> /* Save the new most efficient CPU of the PD */
next prev parent reply other threads:[~2026-10-08 22:53 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-02 15:43 [PATCH 00/18 v2] Improving latency of short slice tasks Vincent Guittot
2026-10-02 15:43 ` [PATCH 01/18 v2] sched/eevdf: Decay positive lag of sleeping entities Vincent Guittot
2026-10-02 15:43 ` [PATCH 02/18] sched/eevdf: Reset lag when waking up on idle cpu Vincent Guittot
2026-10-04 17:30 ` Kayra Cizmeci
2026-10-02 15:44 ` [PATCH 03/18 v2] sched/eevdf: Add per cpu cached min_slice Vincent Guittot
2026-10-02 15:44 ` [PATCH 04/18 v2] sched/eevdf: Compare min slice during wake_affine Vincent Guittot
2026-10-05 15:58 ` Kayra Cizmeci
2026-10-02 15:44 ` [PATCH 05/18 v2] sched/eevdf: Add min slice check when selecting CPU Vincent Guittot
2026-10-04 19:18 ` Kayra Cizmeci
2026-10-02 15:44 ` [PATCH 06/18 v2] sched/fair: Prepare select_task_rq_fair() to be called for new cases Vincent Guittot
2026-10-06 22:25 ` Tim Chen
2026-10-02 15:44 ` [PATCH 07/18] sched/fair: Add push task mechanism for fair Vincent Guittot
2026-10-07 2:45 ` Chen Yu
2026-10-02 15:44 ` [PATCH 08/18] sched/fair: Optimize " Vincent Guittot
2026-10-02 15:44 ` [PATCH 09/18 v2] sched/core: Add rq flag to tick parameters Vincent Guittot
2026-10-02 15:44 ` [PATCH 10/18 v2] sched/fair: Add force push task mechanism for fair Vincent Guittot
2026-10-06 19:24 ` Kayra Cizmeci
2026-10-09 5:53 ` Kayra Cizmeci
2026-10-02 15:44 ` [PATCH 11/18 v2] sched/fair: Support not wakeup case in select_idle_sibling Vincent Guittot
2026-10-07 17:55 ` Tim Chen
2026-10-02 15:44 ` [PATCH 12/18 v2] sched/eevdf: Try to push short slice task on a better CPU Vincent Guittot
2026-10-02 15:44 ` [PATCH 13/18 v2] sched/eevdf: Push short slice task that are not picked Vincent Guittot
2026-10-02 15:44 ` [PATCH 14/18 v2] sched/fair: Enable push task for preempt short Vincent Guittot
2026-10-09 11:16 ` Kayra Cizmeci
2026-10-02 15:44 ` [PATCH 15/18 v2] energy model: Add a get previous state function Vincent Guittot
2026-10-02 15:44 ` [PATCH 16/18 v2] sched/fair: Rework feec() to use cost instead of spare capacity Vincent Guittot
2026-10-02 15:44 ` [PATCH 17/18 v2] energy model: Remove unused em_cpu_energy() Vincent Guittot
2026-10-02 15:44 ` [PATCH 18/18 v2] sched/fair: Take into account slice in EAS Vincent Guittot
2026-10-07 14:36 ` Kayra Cizmeci
2026-10-08 22:53 ` Tim Chen [this message]
2026-10-09 6:31 ` Kayra Cizmeci
2026-10-08 19:12 ` [PATCH 00/18 v2] Improving latency of short slice tasks Kayra Cizmeci
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=179bcb50be21f834423f9b5c068b5fce4cb65871.camel@linux.intel.com \
--to=tim.c.chen@linux.intel.com \
--cc=arighi@nvidia.com \
--cc=bsegall@google.com \
--cc=changwoo@igalia.com \
--cc=christian.loehle@arm.com \
--cc=dietmar.eggemann@arm.com \
--cc=juri.lelli@redhat.com \
--cc=kprateek.nayak@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=lukasz.luba@arm.com \
--cc=mgorman@suse.de \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=pierre.gondois@arm.com \
--cc=qyousef@layalina.io \
--cc=rafael@kernel.org \
--cc=rostedt@goodmis.org \
--cc=sched-ext@lists.linux.dev \
--cc=sshegde@linux.ibm.com \
--cc=tj@kernel.org \
--cc=vincent.guittot@linaro.org \
--cc=void@manifault.com \
--cc=vschneid@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®