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