Skip to content

Commit 1e123fd

Browse files
committed
sched_ext: Add __COMPAT helpers for features added during v6.12 devel cycle
cgroup support and scx_bpf_dispatch[_vtime]_from_dsq() are newly added since 8bb3079 ("sched_ext: Fixes incorrect type in bpf_scx_init()") which is the current earliest commit targeted by BPF schedulers. Add compat helpers for them and apply them in the example schedulers. These will be dropped after a few kernel releases. The exact backward compatibility window hasn't been decided yet. Signed-off-by: Tejun Heo <[email protected]>
1 parent 42268ad commit 1e123fd

File tree

3 files changed

+30
-11
lines changed

3 files changed

+30
-11
lines changed

tools/sched_ext/include/scx/compat.bpf.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,25 @@
1515
__ret; \
1616
})
1717

18+
/* v6.12: 819513666966 ("sched_ext: Add cgroup support") */
19+
#define __COMPAT_scx_bpf_task_cgroup(p) \
20+
(bpf_ksym_exists(scx_bpf_task_cgroup) ? \
21+
scx_bpf_task_cgroup((p)) : NULL)
22+
23+
/* v6.12: 4c30f5ce4f7a ("sched_ext: Implement scx_bpf_dispatch[_vtime]_from_dsq()") */
24+
#define __COMPAT_scx_bpf_dispatch_from_dsq_set_slice(it, slice) \
25+
(bpf_ksym_exists(scx_bpf_dispatch_from_dsq_set_slice) ? \
26+
scx_bpf_dispatch_from_dsq_set_slice((it), (slice)) : (void)0)
27+
#define __COMPAT_scx_bpf_dispatch_from_dsq_set_vtime(it, vtime) \
28+
(bpf_ksym_exists(scx_bpf_dispatch_from_dsq_set_vtime) ? \
29+
scx_bpf_dispatch_from_dsq_set_vtime((it), (vtime)) : (void)0)
30+
#define __COMPAT_scx_bpf_dispatch_from_dsq(it, p, dsq_id, enq_flags) \
31+
(bpf_ksym_exists(scx_bpf_dispatch_from_dsq) ? \
32+
scx_bpf_dispatch_from_dsq((it), (p), (dsq_id), (enq_flags)) : false)
33+
#define __COMPAT_scx_bpf_dispatch_vtime_from_dsq(it, p, dsq_id, enq_flags) \
34+
(bpf_ksym_exists(scx_bpf_dispatch_vtime_from_dsq) ? \
35+
scx_bpf_dispatch_vtime_from_dsq((it), (p), (dsq_id), (enq_flags)) : false)
36+
1837
/*
1938
* Define sched_ext_ops. This may be expanded to define multiple variants for
2039
* backward compatibility. See compat.h::SCX_OPS_LOAD/ATTACH().

tools/sched_ext/scx_flatcg.bpf.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ void BPF_STRUCT_OPS(fcg_enqueue, struct task_struct *p, u64 enq_flags)
383383
return;
384384
}
385385

386-
cgrp = scx_bpf_task_cgroup(p);
386+
cgrp = __COMPAT_scx_bpf_task_cgroup(p);
387387
cgc = find_cgrp_ctx(cgrp);
388388
if (!cgc)
389389
goto out_release;
@@ -509,7 +509,7 @@ void BPF_STRUCT_OPS(fcg_runnable, struct task_struct *p, u64 enq_flags)
509509
{
510510
struct cgroup *cgrp;
511511

512-
cgrp = scx_bpf_task_cgroup(p);
512+
cgrp = __COMPAT_scx_bpf_task_cgroup(p);
513513
update_active_weight_sums(cgrp, true);
514514
bpf_cgroup_release(cgrp);
515515
}
@@ -522,7 +522,7 @@ void BPF_STRUCT_OPS(fcg_running, struct task_struct *p)
522522
if (fifo_sched)
523523
return;
524524

525-
cgrp = scx_bpf_task_cgroup(p);
525+
cgrp = __COMPAT_scx_bpf_task_cgroup(p);
526526
cgc = find_cgrp_ctx(cgrp);
527527
if (cgc) {
528528
/*
@@ -565,7 +565,7 @@ void BPF_STRUCT_OPS(fcg_stopping, struct task_struct *p, bool runnable)
565565
if (!taskc->bypassed_at)
566566
return;
567567

568-
cgrp = scx_bpf_task_cgroup(p);
568+
cgrp = __COMPAT_scx_bpf_task_cgroup(p);
569569
cgc = find_cgrp_ctx(cgrp);
570570
if (cgc) {
571571
__sync_fetch_and_add(&cgc->cvtime_delta,
@@ -579,7 +579,7 @@ void BPF_STRUCT_OPS(fcg_quiescent, struct task_struct *p, u64 deq_flags)
579579
{
580580
struct cgroup *cgrp;
581581

582-
cgrp = scx_bpf_task_cgroup(p);
582+
cgrp = __COMPAT_scx_bpf_task_cgroup(p);
583583
update_active_weight_sums(cgrp, false);
584584
bpf_cgroup_release(cgrp);
585585
}

tools/sched_ext/scx_qmap.bpf.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -318,11 +318,11 @@ static bool dispatch_highpri(bool from_timer)
318318

319319
if (tctx->highpri) {
320320
/* exercise the set_*() and vtime interface too */
321-
scx_bpf_dispatch_from_dsq_set_slice(
321+
__COMPAT_scx_bpf_dispatch_from_dsq_set_slice(
322322
BPF_FOR_EACH_ITER, slice_ns * 2);
323-
scx_bpf_dispatch_from_dsq_set_vtime(
323+
__COMPAT_scx_bpf_dispatch_from_dsq_set_vtime(
324324
BPF_FOR_EACH_ITER, highpri_seq++);
325-
scx_bpf_dispatch_vtime_from_dsq(
325+
__COMPAT_scx_bpf_dispatch_vtime_from_dsq(
326326
BPF_FOR_EACH_ITER, p, HIGHPRI_DSQ, 0);
327327
}
328328
}
@@ -340,9 +340,9 @@ static bool dispatch_highpri(bool from_timer)
340340
else
341341
cpu = scx_bpf_pick_any_cpu(p->cpus_ptr, 0);
342342

343-
if (scx_bpf_dispatch_from_dsq(BPF_FOR_EACH_ITER, p,
344-
SCX_DSQ_LOCAL_ON | cpu,
345-
SCX_ENQ_PREEMPT)) {
343+
if (__COMPAT_scx_bpf_dispatch_from_dsq(BPF_FOR_EACH_ITER, p,
344+
SCX_DSQ_LOCAL_ON | cpu,
345+
SCX_ENQ_PREEMPT)) {
346346
if (cpu == this_cpu) {
347347
dispatched = true;
348348
__sync_fetch_and_add(&nr_expedited_local, 1);

0 commit comments

Comments
 (0)