[RFC PATCH v6 24/25] sched/core: Execute enqueued balance callbacks after migrate_disable_switch

From: Yuri Andriaccio

Date: Mon Jun 08 2026 - 08:22:22 EST


Execute balance callbacks after migrate_disable_switch.
Balancing may be requested on the __schedule path, in migrate_disable_switch,
when the running task is throttled and then pushed away from its runqueue.

Signed-off-by: Yuri Andriaccio <yurand2000@xxxxxxxxx>
---
kernel/sched/core.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 9e337f0090b3..1d458638aab9 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2410,6 +2410,9 @@ do_set_cpus_allowed(struct task_struct *p, struct affinity_context *ctx);

static void migrate_disable_switch(struct rq *rq, struct task_struct *p)
{
+ struct rq_flags rf;
+ struct balance_callback *head;
+
struct affinity_context ac = {
.new_mask = cpumask_of(rq->cpu),
.flags = SCA_MIGRATE_DISABLE,
@@ -2421,8 +2424,13 @@ static void migrate_disable_switch(struct rq *rq, struct task_struct *p)
if (p->cpus_ptr != &p->cpus_mask)
return;

- scoped_guard (task_rq_lock, p)
- do_set_cpus_allowed(p, &ac);
+ rq = task_rq_lock(p, &rf);
+
+ do_set_cpus_allowed(p, &ac);
+
+ head = splice_balance_callbacks(rq);
+ task_rq_unlock(rq, p, &rf);
+ balance_callbacks(rq, head);
}

void ___migrate_enable(void)
--
2.54.0