Forwarded: [PATCH] sched/fair: Skip newidle balance for remote rqs

From: syzbot

Date: Thu Jun 11 2026 - 21:50:41 EST


For archival purposes, forwarding an incoming command email to
linux-kernel@xxxxxxxxxxxxxxx, syzkaller-bugs@xxxxxxxxxxxxxxxx.

***

Subject: [PATCH] sched/fair: Skip newidle balance for remote rqs
Author: jie.wang@xxxxxxxxx

#syz test: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git 49e02880ec0a8c378e811bc9d85da188d7c6204c

Commit b3a2dfa8b42e ("sched/fair: Add newidle balance to
pick_task_fair()") added sched_balance_newidle() to pick_task_fair().
With CONFIG_SCHED_CORE, the core-wide selection loop in pick_next_task()
calls pick_task() for each sibling rq. When a sibling has no CFS tasks,
pick_task_fair() enters newidle balancing which drops the shared
core-wide rq lock.

During this window, tasks already selected for earlier siblings can be
migrated away, making core_pick stale. This causes task_rq(p) != rq in
hrtick_start_fair().

Skip newidle balance when called for a remote rq. The sibling will do
its own newidle balance when it schedules itself.

Fixes: b3a2dfa8b42e ("sched/fair: Add newidle balance to pick_task_fair()")
Reported-by: syzbot+2cbf10efc23b22ff9c31@xxxxxxxxxxxxxxxxxxxxxxxxx
Closes: https://syzkaller.appspot.com/bug?extid=2cbf10efc23b22ff9c31
Signed-off-by: Jie Wang <jie.wang@xxxxxxxxx>
---
kernel/sched/fair.c | 7 +++++++
1 file changed, 7 insertions(+)

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;
--
2.43.0