1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) 2023. Huawei Technologies Co., Ltd */
3 #define _GNU_SOURCE
4 #include <sched.h>
5 #include <pthread.h>
6 #include <stdbool.h>
7 #include <bpf/btf.h>
8 #include <test_progs.h>
9 
10 #include "test_bpf_ma.skel.h"
11 
12 static void do_bpf_ma_test(const char *name)
13 {
14 	struct test_bpf_ma *skel;
15 	struct bpf_program *prog;
16 	struct btf *btf;
17 	int i, err;
18 
19 	skel = test_bpf_ma__open();
20 	if (!ASSERT_OK_PTR(skel, "open"))
21 		return;
22 
23 	btf = bpf_object__btf(skel->obj);
24 	if (!ASSERT_OK_PTR(btf, "btf"))
25 		goto out;
26 
27 	for (i = 0; i < ARRAY_SIZE(skel->rodata->data_sizes); i++) {
28 		char name[32];
29 		int id;
30 
31 		snprintf(name, sizeof(name), "bin_data_%u", skel->rodata->data_sizes[i]);
32 		id = btf__find_by_name_kind(btf, name, BTF_KIND_STRUCT);
33 		if (!ASSERT_GT(id, 0, "bin_data"))
34 			goto out;
35 		skel->rodata->data_btf_ids[i] = id;
36 	}
37 
38 	prog = bpf_object__find_program_by_name(skel->obj, name);
39 	if (!ASSERT_OK_PTR(prog, "invalid prog name"))
40 		goto out;
41 	bpf_program__set_autoload(prog, true);
42 
43 	err = test_bpf_ma__load(skel);
44 	if (!ASSERT_OK(err, "load"))
45 		goto out;
46 
47 	err = test_bpf_ma__attach(skel);
48 	if (!ASSERT_OK(err, "attach"))
49 		goto out;
50 
51 	skel->bss->pid = getpid();
52 	usleep(1);
53 	ASSERT_OK(skel->bss->err, "test error");
54 out:
55 	test_bpf_ma__destroy(skel);
56 }
57 
58 void test_test_bpf_ma(void)
59 {
60 	if (test__start_subtest("batch_alloc_free"))
61 		do_bpf_ma_test("test_batch_alloc_free");
62 	if (test__start_subtest("free_through_map_free"))
63 		do_bpf_ma_test("test_free_through_map_free");
64 	if (test__start_subtest("batch_percpu_alloc_free"))
65 		do_bpf_ma_test("test_batch_percpu_alloc_free");
66 	if (test__start_subtest("percpu_free_through_map_free"))
67 		do_bpf_ma_test("test_percpu_free_through_map_free");
68 }
69