Re: [PATCH 04/18] sched/core: Avoid false migration warning for proxy donors

From: Peter Zijlstra

Date: Thu Sep 10 2026 - 06:17:29 EST


On Mon, Aug 31, 2026 at 03:42:14PM +0200, Andrea Righi wrote:
> Proxy execution can move a blocked donor's scheduling context to the
> lock owner's CPU even when the donor is migration-disabled. The donor
> does not execute there, and its original execution CPU remains recorded
> in wake_cpu.
>
> set_task_cpu() warns unconditionally for migration-disabled tasks, so a
> subsequent proxy migration or the wakeup path returning the donor home
> triggers a false positive. Moving a blocked scheduling context does not
> violate the migration-disabled execution context.
>
> Exclude blocked proxy donors from the warning. The proxy wakeup path
> restores an executable placement before clearing the blocked state.
>
> This is a preparatory fix for enabling proxy execution together with
> sched_ext.
>
> Acked-by: John Stultz <jstultz@xxxxxxxxxx>
> Signed-off-by: Andrea Righi <arighi@xxxxxxxxxx>
> ---
> kernel/sched/core.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 14d0d5c884393..0a2eabadfee02 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -3351,6 +3351,8 @@ void relax_compatible_cpus_allowed_ptr(struct task_struct *p)
> void set_task_cpu(struct task_struct *p, unsigned int new_cpu)
> {
> unsigned int state = READ_ONCE(p->__state);
> + bool proxy_migrated = sched_proxy_exec() && p->is_blocked &&
> + task_cpu(p) != p->wake_cpu;
>
> /*
> * We should never call set_task_cpu() on a blocked task,
> @@ -3386,7 +3388,12 @@ void set_task_cpu(struct task_struct *p, unsigned int new_cpu)
> */
> WARN_ON_ONCE(!cpu_online(new_cpu));
>
> - WARN_ON_ONCE(is_migration_disabled(p));
> + /*
> + * Proxy execution can move a blocked task's scheduling context to any
> + * CPU without moving its migration-disabled execution context. The
> + * wakeup path will return the task to a CPU where it can execute.
> + */
> + WARN_ON_ONCE(is_migration_disabled(p) && !proxy_migrated);
>
> trace_sched_migrate_task(p, new_cpu);

I'm not sure why we're not hitting this upstream?