Messages in this thread Patch in this message |  | | From | Andrea Righi <> | | Subject | [PATCH 01/10] sched/core: Skip migration disabled tasks in proxy execution | | Date | Wed, 6 May 2026 19:45:41 +0200 |
| |
Never attempt to migrate migration-disabled tasks or tasks that can only run on a single CPU when switching donor's execution context, preventing task pinning violations.
Signed-off-by: Andrea Righi <arighi@nvidia.com> --- kernel/sched/core.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index da20fb6ea25ae..75541e5bb66d1 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -6793,9 +6793,13 @@ static void proxy_force_return(struct rq *rq, struct rq_flags *rf, update_rq_clock(task_rq); deactivate_task(task_rq, p, DEQUEUE_NOCLOCK); - cpu = select_task_rq(p, p->wake_cpu, &wake_flag); - set_task_cpu(p, cpu); - target_rq = cpu_rq(cpu); + if (p->nr_cpus_allowed > 1 && !is_migration_disabled(p)) { + cpu = select_task_rq(p, p->wake_cpu, &wake_flag); + set_task_cpu(p, cpu); + target_rq = cpu_rq(cpu); + } else { + target_rq = task_rq; + } clear_task_blocked_on(p, NULL); } @@ -6893,6 +6897,18 @@ find_proxy_task(struct rq *rq, struct task_struct *donor, struct rq_flags *rf) */ if (curr_in_chain) return proxy_resched_idle(rq); + /* + * Tasks pinned to a single CPU (per-CPU kthreads via + * kthread_bind(), tasks under migrate_disable()) cannot + * be moved to @owner_cpu. proxy_migrate_task() uses + * __set_task_cpu() which would silently violate the + * pinning and leave the task to run on a CPU outside + * its cpus_ptr once it is unblocked. Stay on this CPU + * via force_return; the owner running elsewhere will + * wake @p back up when the mutex becomes available. + */ + if (p->nr_cpus_allowed == 1 || is_migration_disabled(p)) + goto force_return; goto migrate_task; } -- 2.54.0
|  |