diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 1b23e73f48b0..5beb4e1b480b 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -9942,6 +9942,13 @@ struct task_struct *pick_task_fair(struct rq *rq, struct rq_flags *rf) return p; idle: + /* + * Skip newidle balance for remote rqs -- doing so would drop the + * core-wide rq lock, invalidating already-selected core_picks. + */ + if (rq != this_rq()) + return NULL; + new_tasks = sched_balance_newidle(rq, rf); if (new_tasks < 0) return RETRY_TASK;