Re: [PATCH v33 4/7] sched/proxy: Set TASK_RUNNING when shortcuting return migration

From: Andrea Righi

Date: Sat Oct 24 2026 - 04:36:49 EST


Hi John,

On Fri, Oct 23, 2026 at 10:04:15PM +0000, John Stultz wrote:
> K Prateek's prior patch optimizing find_proxy_tasks() logic to
> shortcut and run previously blocked tasks on the current cpu
> made me realize while we are clearing the blocked_on and
> is_blocked, we are not setting the task state as TASK_RUNNING
> before returning the task to run.
>
> So set the tasks to TASK_RUNNING prior to returning them to run.
>
> Fixes: b049b81bdff6 ("sched: Handle blocked-waiter migration (and return migration)")
> Signed-off-by: John Stultz <jstultz@xxxxxxxxxx>
> ---
> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
> Cc: Ingo Molnar <mingo@xxxxxxxxxx>
> Cc: K Prateek Nayak <kprateek.nayak@xxxxxxx>
> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
> Cc: Juri Lelli <juri.lelli@xxxxxxxxxx>
> Cc: Vincent Guittot <vincent.guittot@xxxxxxxxxx>
> Cc: Valentin Schneider <vschneid@xxxxxxxxxx>
> Cc: Suleiman Souhlal <suleiman@xxxxxxxxxx>
> Cc: Andrea Righi <arighi@xxxxxxxxxx>
> Cc: Metin Kaya <Metin.Kaya@xxxxxxx>
> Cc: Dietmar Eggemann <dietmar.eggemann@xxxxxxx>
> Cc: Steven Rostedt <rostedt@xxxxxxxxxxx>
> Cc: Zimuzo Ezeozue <zezeozue@xxxxxxxxxx>
> Cc: Waiman Long <longman@xxxxxxxxxx>
> Cc: Boqun Feng <boqun.feng@xxxxxxxxx>
> Cc: "Paul E. McKenney" <paulmck@xxxxxxxxxx>
> Cc: Joel Fernandes <joelagnelf@xxxxxxxxxx>
> Cc: Qais Yousef <qyousef@xxxxxxxxxxx>
> Cc: Xuewen Yan <xuewen.yan94@xxxxxxxxx>
> Cc: kuyo chang <kuyo.chang@xxxxxxxxxxxx>
> Cc: hupu <hupu.gm@xxxxxxxxx>
> Cc: Zhan Xusheng <zhanxusheng@xxxxxxxxxx>
> Cc: zhidao su (Xiaomi) <soolaugust@xxxxxxxxx>
> Cc: Hui Su <sh_def@xxxxxxx>
> Cc: Shubhang Kaushik (Ampere) <sh@xxxxxxxxxx>
> Cc: kernel-team@xxxxxxxxxxx
> ---
> kernel/sched/core.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 2cb42de255f7a..43ba76b5a3464 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -7028,6 +7028,7 @@ find_proxy_task(struct rq *rq, struct task_struct *donor, struct rq_flags *rf)
> clear_task_blocked_on(p, mutex);
> if (task_current(rq, p) || p->wake_cpu == task_cpu(p)) {
> p->is_blocked = 0;
> + WRITE_ONCE(p->__state, TASK_RUNNING);
> return p;
> }
> goto activate;

This is basically an inlined ttwu_do_wakeup() without
trace_sched_wakeup().

> @@ -7065,6 +7066,7 @@ find_proxy_task(struct rq *rq, struct task_struct *donor, struct rq_flags *rf)
> __clear_task_blocked_on(p, NULL);
> if (task_current(rq, p) || p->wake_cpu == task_cpu(p)) {
> p->is_blocked = 0;
> + WRITE_ONCE(p->__state, TASK_RUNNING);
> return p;
> }
> goto activate;

Ditto.

Can we just call ttwu_do_wakeup(p)? It'd also avoid having two copies of
the same state transition that can diverge.

Thanks,
-Andrea