Re: [PATCH 04/18] sched/core: Avoid false migration warning for proxy donors
From: Andrea Righi
Date: Tue Sep 15 2026 - 12:15:57 EST
On Thu, Sep 10, 2026 at 12:06:52PM +0200, Peter Zijlstra wrote:
> 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?
I think this can be hit upstream as well. I'll try to create a reproducer.
-Andrea