sched_ext: idle: Handle migration-disabled tasks in BPF code
authorAndrea Righi <arighi@nvidia.com>
Sat, 20 Sep 2025 13:26:21 +0000 (15:26 +0200)
committerTejun Heo <tj@kernel.org>
Mon, 22 Sep 2025 16:24:44 +0000 (06:24 -1000)
commit55ed11b181c43d81ce03b50209e4e7c4a14ba099
treebd08e5de8cc7fedbd3ef4ed37355905b4b20ea72
parenta1eab4d813f7b6e606ed21381b8cfda5c59a87e5
sched_ext: idle: Handle migration-disabled tasks in BPF code

When scx_bpf_select_cpu_dfl()/and() kfuncs are invoked outside of
ops.select_cpu() we can't rely on @p->migration_disabled to determine if
migration is disabled for the task @p.

In fact, migration is always disabled for the current task while running
BPF code: __bpf_prog_enter() disables migration and __bpf_prog_exit()
re-enables it.

To handle this, when @p->migration_disabled == 1, check whether @p is
the current task. If so, migration was not disabled before entering the
callback, otherwise migration was disabled.

This ensures correct idle CPU selection in all cases. The behavior of
ops.select_cpu() remains unchanged, because this callback is never
invoked for the current task and migration-disabled tasks are always
excluded.

Example: without this change scx_bpf_select_cpu_and() called from
ops.enqueue() always returns -EBUSY; with this change applied, it
correctly returns idle CPUs.

Fixes: 06efc9fe0b8de ("sched_ext: idle: Handle migration-disabled tasks in idle selection")
Cc: stable@vger.kernel.org # v6.16+
Signed-off-by: Andrea Righi <arighi@nvidia.com>
Acked-by: Changwoo Min <changwoo@igalia.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/sched/ext_idle.c