xref: /linux/tools/testing/selftests/sched_ext/create_dsq.bpf.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
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 
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 
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 
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