Commit a0dbf6d0 authored by Eduard Zingerman's avatar Eduard Zingerman Committed by Alexei Starovoitov

selftests/bpf: attach struct_ops maps before test prog runs

In test_loader based tests to bpf_map__attach_struct_ops()
before call to bpf_prog_test_run_opts() in order to trigger
bpf_struct_ops->reg() callbacks on kernel side.
This allows to use __retval macro for struct_ops tests.
Signed-off-by: default avatarEduard Zingerman <eddyz87@gmail.com>
Signed-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
Link: https://lore.kernel.org/r/20240829210833.388152-6-martin.lau@linux.devSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 866d571e
...@@ -890,11 +890,13 @@ void run_subtest(struct test_loader *tester, ...@@ -890,11 +890,13 @@ void run_subtest(struct test_loader *tester,
{ {
struct test_subspec *subspec = unpriv ? &spec->unpriv : &spec->priv; struct test_subspec *subspec = unpriv ? &spec->unpriv : &spec->priv;
struct bpf_program *tprog = NULL, *tprog_iter; struct bpf_program *tprog = NULL, *tprog_iter;
struct bpf_link *link, *links[32] = {};
struct test_spec *spec_iter; struct test_spec *spec_iter;
struct cap_state caps = {}; struct cap_state caps = {};
struct bpf_object *tobj; struct bpf_object *tobj;
struct bpf_map *map; struct bpf_map *map;
int retval, err, i; int retval, err, i;
int links_cnt = 0;
bool should_load; bool should_load;
if (!test__start_subtest(subspec->name)) if (!test__start_subtest(subspec->name))
...@@ -999,6 +1001,26 @@ void run_subtest(struct test_loader *tester, ...@@ -999,6 +1001,26 @@ void run_subtest(struct test_loader *tester,
if (restore_capabilities(&caps)) if (restore_capabilities(&caps))
goto tobj_cleanup; goto tobj_cleanup;
/* Do bpf_map__attach_struct_ops() for each struct_ops map.
* This should trigger bpf_struct_ops->reg callback on kernel side.
*/
bpf_object__for_each_map(map, tobj) {
if (!bpf_map__autocreate(map) ||
bpf_map__type(map) != BPF_MAP_TYPE_STRUCT_OPS)
continue;
if (links_cnt >= ARRAY_SIZE(links)) {
PRINT_FAIL("too many struct_ops maps");
goto tobj_cleanup;
}
link = bpf_map__attach_struct_ops(map);
if (!link) {
PRINT_FAIL("bpf_map__attach_struct_ops failed for map %s: err=%d\n",
bpf_map__name(map), err);
goto tobj_cleanup;
}
links[links_cnt++] = link;
}
if (tester->pre_execution_cb) { if (tester->pre_execution_cb) {
err = tester->pre_execution_cb(tobj); err = tester->pre_execution_cb(tobj);
if (err) { if (err) {
...@@ -1013,9 +1035,14 @@ void run_subtest(struct test_loader *tester, ...@@ -1013,9 +1035,14 @@ void run_subtest(struct test_loader *tester,
PRINT_FAIL("Unexpected retval: %d != %d\n", retval, subspec->retval); PRINT_FAIL("Unexpected retval: %d != %d\n", retval, subspec->retval);
goto tobj_cleanup; goto tobj_cleanup;
} }
/* redo bpf_map__attach_struct_ops for each test */
while (links_cnt > 0)
bpf_link__destroy(links[--links_cnt]);
} }
tobj_cleanup: tobj_cleanup:
while (links_cnt > 0)
bpf_link__destroy(links[--links_cnt]);
bpf_object__close(tobj); bpf_object__close(tobj);
subtest_cleanup: subtest_cleanup:
test__end_subtest(); test__end_subtest();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment