1 // SPDX-License-Identifier: GPL-2.0 2 #include <test_progs.h> 3 #include "percpu_alloc_array.skel.h" 4 #include "percpu_alloc_cgrp_local_storage.skel.h" 5 #include "percpu_alloc_fail.skel.h" 6 7 static void test_array(void) 8 { 9 struct percpu_alloc_array *skel; 10 int err, prog_fd; 11 LIBBPF_OPTS(bpf_test_run_opts, topts); 12 13 skel = percpu_alloc_array__open(); 14 if (!ASSERT_OK_PTR(skel, "percpu_alloc_array__open")) 15 return; 16 17 bpf_program__set_autoload(skel->progs.test_array_map_1, true); 18 bpf_program__set_autoload(skel->progs.test_array_map_2, true); 19 bpf_program__set_autoload(skel->progs.test_array_map_3, true); 20 bpf_program__set_autoload(skel->progs.test_array_map_4, true); 21 22 skel->rodata->nr_cpus = libbpf_num_possible_cpus(); 23 24 err = percpu_alloc_array__load(skel); 25 if (!ASSERT_OK(err, "percpu_alloc_array__load")) 26 goto out; 27 28 err = percpu_alloc_array__attach(skel); 29 if (!ASSERT_OK(err, "percpu_alloc_array__attach")) 30 goto out; 31 32 prog_fd = bpf_program__fd(skel->progs.test_array_map_1); 33 err = bpf_prog_test_run_opts(prog_fd, &topts); 34 ASSERT_OK(err, "test_run array_map 1-4"); 35 ASSERT_EQ(topts.retval, 0, "test_run array_map 1-4"); 36 ASSERT_EQ(skel->bss->cpu0_field_d, 2, "cpu0_field_d"); 37 ASSERT_EQ(skel->bss->sum_field_c, 1, "sum_field_c"); 38 out: 39 percpu_alloc_array__destroy(skel); 40 } 41 42 static void test_array_sleepable(void) 43 { 44 struct percpu_alloc_array *skel; 45 int err, prog_fd; 46 LIBBPF_OPTS(bpf_test_run_opts, topts); 47 48 skel = percpu_alloc_array__open(); 49 if (!ASSERT_OK_PTR(skel, "percpu_alloc__open")) 50 return; 51 52 bpf_program__set_autoload(skel->progs.test_array_map_10, true); 53 54 skel->rodata->nr_cpus = libbpf_num_possible_cpus(); 55 56 err = percpu_alloc_array__load(skel); 57 if (!ASSERT_OK(err, "percpu_alloc_array__load")) 58 goto out; 59 60 err = percpu_alloc_array__attach(skel); 61 if (!ASSERT_OK(err, "percpu_alloc_array__attach")) 62 goto out; 63 64 prog_fd = bpf_program__fd(skel->progs.test_array_map_10); 65 err = bpf_prog_test_run_opts(prog_fd, &topts); 66 ASSERT_OK(err, "test_run array_map_10"); 67 ASSERT_EQ(topts.retval, 0, "test_run array_map_10"); 68 ASSERT_EQ(skel->bss->cpu0_field_d, 2, "cpu0_field_d"); 69 ASSERT_EQ(skel->bss->sum_field_c, 1, "sum_field_c"); 70 out: 71 percpu_alloc_array__destroy(skel); 72 } 73 74 static void test_cgrp_local_storage(void) 75 { 76 struct percpu_alloc_cgrp_local_storage *skel; 77 int err, cgroup_fd, prog_fd; 78 LIBBPF_OPTS(bpf_test_run_opts, topts); 79 80 cgroup_fd = test__join_cgroup("/percpu_alloc"); 81 if (!ASSERT_GE(cgroup_fd, 0, "join_cgroup /percpu_alloc")) 82 return; 83 84 skel = percpu_alloc_cgrp_local_storage__open(); 85 if (!ASSERT_OK_PTR(skel, "percpu_alloc_cgrp_local_storage__open")) 86 goto close_fd; 87 88 skel->rodata->nr_cpus = libbpf_num_possible_cpus(); 89 90 err = percpu_alloc_cgrp_local_storage__load(skel); 91 if (!ASSERT_OK(err, "percpu_alloc_cgrp_local_storage__load")) 92 goto destroy_skel; 93 94 err = percpu_alloc_cgrp_local_storage__attach(skel); 95 if (!ASSERT_OK(err, "percpu_alloc_cgrp_local_storage__attach")) 96 goto destroy_skel; 97 98 prog_fd = bpf_program__fd(skel->progs.test_cgrp_local_storage_1); 99 err = bpf_prog_test_run_opts(prog_fd, &topts); 100 ASSERT_OK(err, "test_run cgrp_local_storage 1-3"); 101 ASSERT_EQ(topts.retval, 0, "test_run cgrp_local_storage 1-3"); 102 ASSERT_EQ(skel->bss->cpu0_field_d, 2, "cpu0_field_d"); 103 ASSERT_EQ(skel->bss->sum_field_c, 1, "sum_field_c"); 104 105 destroy_skel: 106 percpu_alloc_cgrp_local_storage__destroy(skel); 107 close_fd: 108 close(cgroup_fd); 109 } 110 111 static void test_failure(void) { 112 RUN_TESTS(percpu_alloc_fail); 113 } 114 115 void test_percpu_alloc(void) 116 { 117 if (test__start_subtest("array")) 118 test_array(); 119 if (test__start_subtest("array_sleepable")) 120 test_array_sleepable(); 121 if (test__start_subtest("cgrp_local_storage")) 122 test_cgrp_local_storage(); 123 if (test__start_subtest("failure_tests")) 124 test_failure(); 125 } 126