]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sched_ext, scx_qmap: Add and use SCX_ENQ_CPU_SELECTED
authorTejun Heo <tj@kernel.org>
Fri, 27 Sep 2024 23:46:13 +0000 (13:46 -1000)
committerTejun Heo <tj@kernel.org>
Mon, 7 Oct 2024 20:16:18 +0000 (10:16 -1000)
scx_qmap and other schedulers in the SCX repo are using SCX_ENQ_WAKEUP to
tell whether ops.select_cpu() was called. This is incorrect as
ops.select_cpu() can be skipped in the wakeup path and leads to e.g.
incorrectly skipping direct dispatch for tasks that are bound to a single
CPU.

sched core has been updated to specify ENQUEUE_RQ_SELECTED if
->select_task_rq() was called. Map it to SCX_ENQ_CPU_SELECTED and update
scx_qmap to test it instead of SCX_ENQ_WAKEUP.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: David Vernet <void@manifault.com>
Cc: Daniel Hodges <hodges.daniel.scott@gmail.com>
Cc: Changwoo Min <multics69@gmail.com>
Cc: Andrea Righi <andrea.righi@linux.dev>
Cc: Dan Schatzberg <schatzberg.dan@gmail.com>
kernel/sched/ext.c
tools/sched_ext/scx_qmap.bpf.c

index 1df2082d1352e1794fce894a78f14722cadfcf3c..410a4df8a121e0bc81ffb1f62a81330045c074e9 100644 (file)
@@ -696,6 +696,7 @@ enum scx_enq_flags {
        /* expose select ENQUEUE_* flags as enums */
        SCX_ENQ_WAKEUP          = ENQUEUE_WAKEUP,
        SCX_ENQ_HEAD            = ENQUEUE_HEAD,
+       SCX_ENQ_CPU_SELECTED    = ENQUEUE_RQ_SELECTED,
 
        /* high 32bits are SCX specific */
 
index 67e2a7968cc913efd673bb48b95c13ad502168bc..5d1f880d1149e76ee47d0b044dc075df62442875 100644 (file)
@@ -230,8 +230,8 @@ void BPF_STRUCT_OPS(qmap_enqueue, struct task_struct *p, u64 enq_flags)
                return;
        }
 
-       /* if !WAKEUP, select_cpu() wasn't called, try direct dispatch */
-       if (!(enq_flags & SCX_ENQ_WAKEUP) &&
+       /* if select_cpu() wasn't called, try direct dispatch */
+       if (!(enq_flags & SCX_ENQ_CPU_SELECTED) &&
            (cpu = pick_direct_dispatch_cpu(p, scx_bpf_task_cpu(p))) >= 0) {
                __sync_fetch_and_add(&nr_ddsp_from_enq, 1);
                scx_bpf_dispatch(p, SCX_DSQ_LOCAL_ON | cpu, slice_ns, enq_flags);