xref: /openbmc/linux/tools/testing/selftests/bpf/prog_tests/task_kfunc.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1fe147956SDavid Vernet // SPDX-License-Identifier: GPL-2.0
2fe147956SDavid Vernet /* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */
3fe147956SDavid Vernet 
4fe147956SDavid Vernet #define _GNU_SOURCE
5fe147956SDavid Vernet #include <sys/wait.h>
6fe147956SDavid Vernet #include <test_progs.h>
7fe147956SDavid Vernet #include <unistd.h>
8fe147956SDavid Vernet 
9fe147956SDavid Vernet #include "task_kfunc_failure.skel.h"
10fe147956SDavid Vernet #include "task_kfunc_success.skel.h"
11fe147956SDavid Vernet 
open_load_task_kfunc_skel(void)12fe147956SDavid Vernet static struct task_kfunc_success *open_load_task_kfunc_skel(void)
13fe147956SDavid Vernet {
14fe147956SDavid Vernet 	struct task_kfunc_success *skel;
15fe147956SDavid Vernet 	int err;
16fe147956SDavid Vernet 
17fe147956SDavid Vernet 	skel = task_kfunc_success__open();
18fe147956SDavid Vernet 	if (!ASSERT_OK_PTR(skel, "skel_open"))
19fe147956SDavid Vernet 		return NULL;
20fe147956SDavid Vernet 
21fe147956SDavid Vernet 	skel->bss->pid = getpid();
22fe147956SDavid Vernet 
23fe147956SDavid Vernet 	err = task_kfunc_success__load(skel);
24fe147956SDavid Vernet 	if (!ASSERT_OK(err, "skel_load"))
25fe147956SDavid Vernet 		goto cleanup;
26fe147956SDavid Vernet 
27fe147956SDavid Vernet 	return skel;
28fe147956SDavid Vernet 
29fe147956SDavid Vernet cleanup:
30fe147956SDavid Vernet 	task_kfunc_success__destroy(skel);
31fe147956SDavid Vernet 	return NULL;
32fe147956SDavid Vernet }
33fe147956SDavid Vernet 
run_success_test(const char * prog_name)34fe147956SDavid Vernet static void run_success_test(const char *prog_name)
35fe147956SDavid Vernet {
36fe147956SDavid Vernet 	struct task_kfunc_success *skel;
37fe147956SDavid Vernet 	int status;
38fe147956SDavid Vernet 	pid_t child_pid;
39fe147956SDavid Vernet 	struct bpf_program *prog;
40fe147956SDavid Vernet 	struct bpf_link *link = NULL;
41fe147956SDavid Vernet 
42fe147956SDavid Vernet 	skel = open_load_task_kfunc_skel();
43fe147956SDavid Vernet 	if (!ASSERT_OK_PTR(skel, "open_load_skel"))
44fe147956SDavid Vernet 		return;
45fe147956SDavid Vernet 
46fe147956SDavid Vernet 	if (!ASSERT_OK(skel->bss->err, "pre_spawn_err"))
47fe147956SDavid Vernet 		goto cleanup;
48fe147956SDavid Vernet 
49fe147956SDavid Vernet 	prog = bpf_object__find_program_by_name(skel->obj, prog_name);
50fe147956SDavid Vernet 	if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name"))
51fe147956SDavid Vernet 		goto cleanup;
52fe147956SDavid Vernet 
53fe147956SDavid Vernet 	link = bpf_program__attach(prog);
54fe147956SDavid Vernet 	if (!ASSERT_OK_PTR(link, "attached_link"))
55fe147956SDavid Vernet 		goto cleanup;
56fe147956SDavid Vernet 
57fe147956SDavid Vernet 	child_pid = fork();
58fe147956SDavid Vernet 	if (!ASSERT_GT(child_pid, -1, "child_pid"))
59fe147956SDavid Vernet 		goto cleanup;
60fe147956SDavid Vernet 	if (child_pid == 0)
61fe147956SDavid Vernet 		_exit(0);
62fe147956SDavid Vernet 	waitpid(child_pid, &status, 0);
63fe147956SDavid Vernet 
64fe147956SDavid Vernet 	ASSERT_OK(skel->bss->err, "post_wait_err");
65fe147956SDavid Vernet 
66fe147956SDavid Vernet cleanup:
67fe147956SDavid Vernet 	bpf_link__destroy(link);
68fe147956SDavid Vernet 	task_kfunc_success__destroy(skel);
69fe147956SDavid Vernet }
70fe147956SDavid Vernet 
71fe147956SDavid Vernet static const char * const success_tests[] = {
72fe147956SDavid Vernet 	"test_task_acquire_release_argument",
73fe147956SDavid Vernet 	"test_task_acquire_release_current",
74fe147956SDavid Vernet 	"test_task_acquire_leave_in_map",
75fe147956SDavid Vernet 	"test_task_xchg_release",
76f85671c6SDavid Vernet 	"test_task_map_acquire_release",
77fe147956SDavid Vernet 	"test_task_current_acquire_release",
78f471748bSDavid Vernet 	"test_task_from_pid_arg",
79f471748bSDavid Vernet 	"test_task_from_pid_current",
80f471748bSDavid Vernet 	"test_task_from_pid_invalid",
81d02c48faSDavid Vernet 	"task_kfunc_acquire_trusted_walked",
82*63ae8eb2SDave Marchevsky 	"test_task_kfunc_flavor_relo",
83*63ae8eb2SDave Marchevsky 	"test_task_kfunc_flavor_relo_not_found",
84fe147956SDavid Vernet };
85fe147956SDavid Vernet 
test_task_kfunc(void)86fe147956SDavid Vernet void test_task_kfunc(void)
87fe147956SDavid Vernet {
88fe147956SDavid Vernet 	int i;
89fe147956SDavid Vernet 
90fe147956SDavid Vernet 	for (i = 0; i < ARRAY_SIZE(success_tests); i++) {
91fe147956SDavid Vernet 		if (!test__start_subtest(success_tests[i]))
92fe147956SDavid Vernet 			continue;
93fe147956SDavid Vernet 
94fe147956SDavid Vernet 		run_success_test(success_tests[i]);
95fe147956SDavid Vernet 	}
96fe147956SDavid Vernet 
977525daeeSDavid Vernet 	RUN_TESTS(task_kfunc_failure);
98fe147956SDavid Vernet }
99