1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3 * Create and destroy DSQs in a loop.
4 *
5 * Copyright (c) 2024 Meta Platforms, Inc. and affiliates.
6 * Copyright (c) 2024 David Vernet <dvernet@meta.com>
7 */
8
9 #include <scx/common.bpf.h>
10
11 char _license[] SEC("license") = "GPL";
12
BPF_STRUCT_OPS(create_dsq_exit_task,struct task_struct * p,struct scx_exit_task_args * args)13 void BPF_STRUCT_OPS(create_dsq_exit_task, struct task_struct *p,
14 struct scx_exit_task_args *args)
15 {
16 scx_bpf_destroy_dsq(p->pid);
17 }
18
BPF_STRUCT_OPS_SLEEPABLE(create_dsq_init_task,struct task_struct * p,struct scx_init_task_args * args)19 s32 BPF_STRUCT_OPS_SLEEPABLE(create_dsq_init_task, struct task_struct *p,
20 struct scx_init_task_args *args)
21 {
22 s32 err;
23
24 err = scx_bpf_create_dsq(p->pid, -1);
25 if (err)
26 scx_bpf_error("Failed to create DSQ for %s[%d]",
27 p->comm, p->pid);
28
29 return err;
30 }
31
BPF_STRUCT_OPS_SLEEPABLE(create_dsq_init)32 s32 BPF_STRUCT_OPS_SLEEPABLE(create_dsq_init)
33 {
34 u32 i;
35 s32 err;
36
37 bpf_for(i, 0, 1024) {
38 err = scx_bpf_create_dsq(i, -1);
39 if (err) {
40 scx_bpf_error("Failed to create DSQ %d", i);
41 return 0;
42 }
43 }
44
45 bpf_for(i, 0, 1024) {
46 scx_bpf_destroy_dsq(i);
47 }
48
49 return 0;
50 }
51
52 SEC(".struct_ops.link")
53 struct sched_ext_ops create_dsq_ops = {
54 .init_task = (void *) create_dsq_init_task,
55 .exit_task = (void *) create_dsq_exit_task,
56 .init = (void *) create_dsq_init,
57 .name = "create_dsq",
58 };
59