]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
sched_ext: Skip per-CPU tasks in scx_bpf_reenqueue_local()
authorAndrea Righi <arighi@nvidia.com>
Thu, 13 Mar 2025 17:03:21 +0000 (18:03 +0100)
committerTejun Heo <tj@kernel.org>
Thu, 13 Mar 2025 17:07:27 +0000 (07:07 -1000)
scx_bpf_reenqueue_local() can be invoked from ops.cpu_release() to give
tasks that are queued to the local DSQ a chance to migrate to other
CPUs, when a CPU is taken by a higher scheduling class.

However, there is no point re-enqueuing tasks that can only run on that
particular CPU, as they would simply be re-added to the same local DSQ
without any benefit.

Therefore, skip per-CPU tasks in scx_bpf_reenqueue_local().

Signed-off-by: Andrea Righi <arighi@nvidia.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/sched/ext.c

index debcd1cf2de9b28e2e4ebd98d4301569a0ea83dd..db5bc4d57dba4ddb45f281d333e178258a00e0ba 100644 (file)
@@ -6621,8 +6621,12 @@ __bpf_kfunc u32 scx_bpf_reenqueue_local(void)
                 * CPUs disagree, they use %ENQUEUE_RESTORE which is bypassed to
                 * the current local DSQ for running tasks and thus are not
                 * visible to the BPF scheduler.
+                *
+                * Also skip re-enqueueing tasks that can only run on this
+                * CPU, as they would just be re-added to the same local
+                * DSQ without any benefit.
                 */
-               if (p->migration_pending)
+               if (p->migration_pending || is_migration_disabled(p) || p->nr_cpus_allowed == 1)
                        continue;
 
                dispatch_dequeue(rq, p);