xref: /openbmc/linux/tools/testing/selftests/bpf/prog_tests/cgrp_kfunc.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1f583ddf1SDavid Vernet // SPDX-License-Identifier: GPL-2.0
2f583ddf1SDavid Vernet /* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */
3f583ddf1SDavid Vernet 
4f583ddf1SDavid Vernet #define _GNU_SOURCE
5f583ddf1SDavid Vernet #include <cgroup_helpers.h>
6f583ddf1SDavid Vernet #include <test_progs.h>
7f583ddf1SDavid Vernet 
8f583ddf1SDavid Vernet #include "cgrp_kfunc_failure.skel.h"
9f583ddf1SDavid Vernet #include "cgrp_kfunc_success.skel.h"
10f583ddf1SDavid Vernet 
open_load_cgrp_kfunc_skel(void)11f583ddf1SDavid Vernet static struct cgrp_kfunc_success *open_load_cgrp_kfunc_skel(void)
12f583ddf1SDavid Vernet {
13f583ddf1SDavid Vernet 	struct cgrp_kfunc_success *skel;
14f583ddf1SDavid Vernet 	int err;
15f583ddf1SDavid Vernet 
16f583ddf1SDavid Vernet 	skel = cgrp_kfunc_success__open();
17f583ddf1SDavid Vernet 	if (!ASSERT_OK_PTR(skel, "skel_open"))
18f583ddf1SDavid Vernet 		return NULL;
19f583ddf1SDavid Vernet 
20f583ddf1SDavid Vernet 	skel->bss->pid = getpid();
21f583ddf1SDavid Vernet 
22f583ddf1SDavid Vernet 	err = cgrp_kfunc_success__load(skel);
23f583ddf1SDavid Vernet 	if (!ASSERT_OK(err, "skel_load"))
24f583ddf1SDavid Vernet 		goto cleanup;
25f583ddf1SDavid Vernet 
26f583ddf1SDavid Vernet 	return skel;
27f583ddf1SDavid Vernet 
28f583ddf1SDavid Vernet cleanup:
29f583ddf1SDavid Vernet 	cgrp_kfunc_success__destroy(skel);
30f583ddf1SDavid Vernet 	return NULL;
31f583ddf1SDavid Vernet }
32f583ddf1SDavid Vernet 
mkdir_rm_test_dir(void)33f583ddf1SDavid Vernet static int mkdir_rm_test_dir(void)
34f583ddf1SDavid Vernet {
35f583ddf1SDavid Vernet 	int fd;
36f583ddf1SDavid Vernet 	const char *cgrp_path = "cgrp_kfunc";
37f583ddf1SDavid Vernet 
38f583ddf1SDavid Vernet 	fd = create_and_get_cgroup(cgrp_path);
39f583ddf1SDavid Vernet 	if (!ASSERT_GT(fd, 0, "mkdir_cgrp_fd"))
40f583ddf1SDavid Vernet 		return -1;
41f583ddf1SDavid Vernet 
42f583ddf1SDavid Vernet 	close(fd);
43f583ddf1SDavid Vernet 	remove_cgroup(cgrp_path);
44f583ddf1SDavid Vernet 
45f583ddf1SDavid Vernet 	return 0;
46f583ddf1SDavid Vernet }
47f583ddf1SDavid Vernet 
run_success_test(const char * prog_name)48f583ddf1SDavid Vernet static void run_success_test(const char *prog_name)
49f583ddf1SDavid Vernet {
50f583ddf1SDavid Vernet 	struct cgrp_kfunc_success *skel;
51f583ddf1SDavid Vernet 	struct bpf_program *prog;
52f583ddf1SDavid Vernet 	struct bpf_link *link = NULL;
53f583ddf1SDavid Vernet 
54f583ddf1SDavid Vernet 	skel = open_load_cgrp_kfunc_skel();
55f583ddf1SDavid Vernet 	if (!ASSERT_OK_PTR(skel, "open_load_skel"))
56f583ddf1SDavid Vernet 		return;
57f583ddf1SDavid Vernet 
58f583ddf1SDavid Vernet 	if (!ASSERT_OK(skel->bss->err, "pre_mkdir_err"))
59f583ddf1SDavid Vernet 		goto cleanup;
60f583ddf1SDavid Vernet 
61f583ddf1SDavid Vernet 	prog = bpf_object__find_program_by_name(skel->obj, prog_name);
62f583ddf1SDavid Vernet 	if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name"))
63f583ddf1SDavid Vernet 		goto cleanup;
64f583ddf1SDavid Vernet 
65f583ddf1SDavid Vernet 	link = bpf_program__attach(prog);
66f583ddf1SDavid Vernet 	if (!ASSERT_OK_PTR(link, "attached_link"))
67f583ddf1SDavid Vernet 		goto cleanup;
68f583ddf1SDavid Vernet 
69f583ddf1SDavid Vernet 	ASSERT_EQ(skel->bss->invocations, 0, "pre_rmdir_count");
70f583ddf1SDavid Vernet 	if (!ASSERT_OK(mkdir_rm_test_dir(), "cgrp_mkdir"))
71f583ddf1SDavid Vernet 		goto cleanup;
72f583ddf1SDavid Vernet 
73f583ddf1SDavid Vernet 	ASSERT_EQ(skel->bss->invocations, 1, "post_rmdir_count");
74f583ddf1SDavid Vernet 	ASSERT_OK(skel->bss->err, "post_rmdir_err");
75f583ddf1SDavid Vernet 
76f583ddf1SDavid Vernet cleanup:
77f583ddf1SDavid Vernet 	bpf_link__destroy(link);
78f583ddf1SDavid Vernet 	cgrp_kfunc_success__destroy(skel);
79f583ddf1SDavid Vernet }
80f583ddf1SDavid Vernet 
81f583ddf1SDavid Vernet static const char * const success_tests[] = {
82f583ddf1SDavid Vernet 	"test_cgrp_acquire_release_argument",
83f583ddf1SDavid Vernet 	"test_cgrp_acquire_leave_in_map",
84f583ddf1SDavid Vernet 	"test_cgrp_xchg_release",
85f583ddf1SDavid Vernet 	"test_cgrp_get_release",
86227a89cfSDavid Vernet 	"test_cgrp_get_ancestors",
87*d0093aaeSTejun Heo 	"test_cgrp_from_id",
88f583ddf1SDavid Vernet };
89f583ddf1SDavid Vernet 
test_cgrp_kfunc(void)90f583ddf1SDavid Vernet void test_cgrp_kfunc(void)
91f583ddf1SDavid Vernet {
92f583ddf1SDavid Vernet 	int i, err;
93f583ddf1SDavid Vernet 
94f583ddf1SDavid Vernet 	err = setup_cgroup_environment();
95f583ddf1SDavid Vernet 	if (!ASSERT_OK(err, "cgrp_env_setup"))
96f583ddf1SDavid Vernet 		goto cleanup;
97f583ddf1SDavid Vernet 
98f583ddf1SDavid Vernet 	for (i = 0; i < ARRAY_SIZE(success_tests); i++) {
99f583ddf1SDavid Vernet 		if (!test__start_subtest(success_tests[i]))
100f583ddf1SDavid Vernet 			continue;
101f583ddf1SDavid Vernet 
102f583ddf1SDavid Vernet 		run_success_test(success_tests[i]);
103f583ddf1SDavid Vernet 	}
104f583ddf1SDavid Vernet 
1058032cad1SJoanne Koong 	RUN_TESTS(cgrp_kfunc_failure);
106f583ddf1SDavid Vernet 
107f583ddf1SDavid Vernet cleanup:
108f583ddf1SDavid Vernet 	cleanup_cgroup_environment();
109f583ddf1SDavid Vernet }
110