1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (c) 2024 Meta Platforms, Inc. and affiliates.
4 * Copyright (c) 2024 David Vernet <dvernet@meta.com>
6 #include <scx/common.bpf.h>
8 char _license
[] SEC("license") = "GPL";
9 const volatile s32 nr_cpus
;
14 __uint(type
, BPF_MAP_TYPE_QUEUE
);
15 __uint(max_entries
, 8192);
19 s32
BPF_STRUCT_OPS(dsp_local_on_select_cpu
, struct task_struct
*p
,
20 s32 prev_cpu
, u64 wake_flags
)
25 void BPF_STRUCT_OPS(dsp_local_on_enqueue
, struct task_struct
*p
,
30 if (bpf_map_push_elem(&queue
, &pid
, 0))
31 scx_bpf_error("Failed to enqueue %s[%d]", p
->comm
, p
->pid
);
34 void BPF_STRUCT_OPS(dsp_local_on_dispatch
, s32 cpu
, struct task_struct
*prev
)
37 struct task_struct
*p
;
39 if (bpf_map_pop_elem(&queue
, &pid
))
42 p
= bpf_task_from_pid(pid
);
46 target
= bpf_get_prandom_u32() % nr_cpus
;
48 scx_bpf_dispatch(p
, SCX_DSQ_LOCAL_ON
| target
, SCX_SLICE_DFL
, 0);
52 void BPF_STRUCT_OPS(dsp_local_on_exit
, struct scx_exit_info
*ei
)
57 SEC(".struct_ops.link")
58 struct sched_ext_ops dsp_local_on_ops
= {
59 .select_cpu
= (void *) dsp_local_on_select_cpu
,
60 .enqueue
= (void *) dsp_local_on_enqueue
,
61 .dispatch
= (void *) dsp_local_on_dispatch
,
62 .exit
= (void *) dsp_local_on_exit
,
63 .name
= "dsp_local_on",