xref: /linux/tools/testing/selftests/bpf/prog_tests/task_under_cgroup.c (revision 576d7fed09c7edbae7600f29a8a3ed6c1ead904f)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2023 Bytedance */
3 
4 #include <sys/syscall.h>
5 #include <test_progs.h>
6 #include <cgroup_helpers.h>
7 #include "test_task_under_cgroup.skel.h"
8 
9 #define FOO	"/foo"
10 
11 void test_task_under_cgroup(void)
12 {
13 	struct test_task_under_cgroup *skel;
14 	int ret, foo;
15 	pid_t pid;
16 
17 	foo = test__join_cgroup(FOO);
18 	if (!ASSERT_OK(foo < 0, "cgroup_join_foo"))
19 		return;
20 
21 	skel = test_task_under_cgroup__open();
22 	if (!ASSERT_OK_PTR(skel, "test_task_under_cgroup__open"))
23 		goto cleanup;
24 
25 	skel->rodata->local_pid = getpid();
26 	skel->bss->remote_pid = getpid();
27 	skel->rodata->cgid = get_cgroup_id(FOO);
28 
29 	ret = test_task_under_cgroup__load(skel);
30 	if (!ASSERT_OK(ret, "test_task_under_cgroup__load"))
31 		goto cleanup;
32 
33 	/* First, attach the LSM program, and then it will be triggered when the
34 	 * TP_BTF program is attached.
35 	 */
36 	skel->links.lsm_run = bpf_program__attach_lsm(skel->progs.lsm_run);
37 	if (!ASSERT_OK_PTR(skel->links.lsm_run, "attach_lsm"))
38 		goto cleanup;
39 
40 	skel->links.tp_btf_run = bpf_program__attach_trace(skel->progs.tp_btf_run);
41 	if (!ASSERT_OK_PTR(skel->links.tp_btf_run, "attach_tp_btf"))
42 		goto cleanup;
43 
44 	pid = fork();
45 	if (pid == 0)
46 		exit(0);
47 
48 	ret = (pid == -1);
49 	if (ASSERT_OK(ret, "fork process"))
50 		wait(NULL);
51 
52 	test_task_under_cgroup__detach(skel);
53 
54 	ASSERT_NEQ(skel->bss->remote_pid, skel->rodata->local_pid,
55 		   "test task_under_cgroup");
56 
57 cleanup:
58 	test_task_under_cgroup__destroy(skel);
59 	close(foo);
60 }
61