Re: [PATCH] sched:pelt: fix pelt clock sync when entering idle

From: Samuel Wu

Date: Tue Mar 03 2026 - 14:48:17 EST


On Wed, Jan 21, 2026 at 8:33 AM Vincent Guittot
<vincent.guittot@xxxxxxxxxx> wrote:
>
> Samuel and Alex reported regressions of the util_avg of RT rq with
> commit 17e3e88ed0b6 ("sched/fair: Fix pelt lost idle time detection").
> It happens that fair is updating and syncing the pelt clock with task one
> when pick_next_task_fair() fails to pick a task but before the prev
> scheduling class got a chance to update its pelt signals.
>
> Move update_idle_rq_clock_pelt() in set_next_task_idle() which is called
> after prev class has been called.
>
> Fixes: 17e3e88ed0b6 ("sched/fair: Fix pelt lost idle time detection")
> Reported-by: Samuel Wu <wusamuel@xxxxxxxxxx>
> Closes: https://lore.kernel.org/all/CAG2KctpO6VKS6GN4QWDji0t92_gNBJ7HjjXrE+6H+RwRXt=iLg@xxxxxxxxxxxxxx/
> Tested-by: Samuel Wu <wusamuel@xxxxxxxxxx>
> Reported-by: Alex Hoh <Alex.Hoh@xxxxxxxxxxxx>
> Closes: https://lore.kernel.org/all/8cf19bf0e0054dcfed70e9935029201694f1bb5a.camel@xxxxxxxxxxxx/
> Tested-by: Alex Hoh <Alex.Hoh@xxxxxxxxxxxx>
> Signed-off-by: Vincent Guittot <vincent.guittot@xxxxxxxxxx>
> ---
> kernel/sched/fair.c | 6 ------
> kernel/sched/idle.c | 6 ++++++
> 2 files changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 108213e94158..bea71564d3da 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -8989,12 +8989,6 @@ pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf
> goto again;
> }
>
> - /*
> - * rq is about to be idle, check if we need to update the
> - * lost_idle_time of clock_pelt
> - */
> - update_idle_rq_clock_pelt(rq);
> -
> return NULL;
> }
>
> diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
> index 65eb8f8c1a5d..a7c5676b9abe 100644
> --- a/kernel/sched/idle.c
> +++ b/kernel/sched/idle.c
> @@ -468,6 +468,12 @@ static void set_next_task_idle(struct rq *rq, struct task_struct *next, bool fir
> scx_update_idle(rq, true, true);
> schedstat_inc(rq->sched_goidle);
> next->se.exec_start = rq_clock_task(rq);
> +
> + /*
> + * rq is about to be idle, check if we need to update the
> + * lost_idle_time of clock_pelt
> + */
> + update_idle_rq_clock_pelt(rq);
> }
>
> struct task_struct *pick_task_idle(struct rq *rq, struct rq_flags *rf)
> --
> 2.43.0
>

Hi Vincent,

Any concern with backporting this to LTS branches such as 6.1 and 6.6?
I am not sure if there is a dependency with EEVDF, but the fixes
patch, 17e3e88ed0b6 ("sched/fair: Fix pelt lost idle time detection"),
was backported to those aforementioned branches.

Thanks,
Sam