selftests/bpf: Stop using bpf_program__load
authorDave Marchevsky <davemarchevsky@fb.com>
Fri, 17 Sep 2021 18:29:04 +0000 (11:29 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 17 Sep 2021 21:02:05 +0000 (14:02 -0700)
bpf_program__load is not supposed to be used directly. Replace it with
bpf_object__ APIs for the reference_tracking prog_test, which is the
last offender in bpf selftests.

Some additional complexity is added for this test, namely the use of one
bpf_object to iterate through progs, while a second bpf_object is
created and opened/closed to test actual loading of progs. This is
because the test was doing bpf_program__load then __unload to test
loading of individual progs and same semantics with
bpf_object__load/__unload result in failure to load an __unload-ed obj.

Signed-off-by: Dave Marchevsky <davemarchevsky@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20210917182911.2426606-3-davemarchevsky@fb.com
tools/testing/selftests/bpf/prog_tests/reference_tracking.c

index 4e91f4d..ded2dc8 100644 (file)
@@ -1,6 +1,21 @@
 // SPDX-License-Identifier: GPL-2.0
 #include <test_progs.h>
 
+static void toggle_object_autoload_progs(const struct bpf_object *obj,
+                                        const char *title_load)
+{
+       struct bpf_program *prog;
+
+       bpf_object__for_each_program(prog, obj) {
+               const char *title = bpf_program__section_name(prog);
+
+               if (!strcmp(title_load, title))
+                       bpf_program__set_autoload(prog, true);
+               else
+                       bpf_program__set_autoload(prog, false);
+       }
+}
+
 void test_reference_tracking(void)
 {
        const char *file = "test_sk_lookup_kern.o";
@@ -9,21 +24,21 @@ void test_reference_tracking(void)
                .object_name = obj_name,
                .relaxed_maps = true,
        );
-       struct bpf_object *obj;
+       struct bpf_object *obj_iter, *obj = NULL;
        struct bpf_program *prog;
        __u32 duration = 0;
        int err = 0;
 
-       obj = bpf_object__open_file(file, &open_opts);
-       if (!ASSERT_OK_PTR(obj, "obj_open_file"))
+       obj_iter = bpf_object__open_file(file, &open_opts);
+       if (!ASSERT_OK_PTR(obj_iter, "obj_iter_open_file"))
                return;
 
-       if (CHECK(strcmp(bpf_object__name(obj), obj_name), "obj_name",
+       if (CHECK(strcmp(bpf_object__name(obj_iter), obj_name), "obj_name",
                  "wrong obj name '%s', expected '%s'\n",
-                 bpf_object__name(obj), obj_name))
+                 bpf_object__name(obj_iter), obj_name))
                goto cleanup;
 
-       bpf_object__for_each_program(prog, obj) {
+       bpf_object__for_each_program(prog, obj_iter) {
                const char *title;
 
                /* Ignore .text sections */
@@ -34,19 +49,27 @@ void test_reference_tracking(void)
                if (!test__start_subtest(title))
                        continue;
 
+               obj = bpf_object__open_file(file, &open_opts);
+               if (!ASSERT_OK_PTR(obj, "obj_open_file"))
+                       goto cleanup;
+
+               toggle_object_autoload_progs(obj, title);
                /* Expect verifier failure if test name has 'err' */
                if (strstr(title, "err_") != NULL) {
                        libbpf_print_fn_t old_print_fn;
 
                        old_print_fn = libbpf_set_print(NULL);
-                       err = !bpf_program__load(prog, "GPL", 0);
+                       err = !bpf_object__load(obj);
                        libbpf_set_print(old_print_fn);
                } else {
-                       err = bpf_program__load(prog, "GPL", 0);
+                       err = bpf_object__load(obj);
                }
                CHECK(err, title, "\n");
+               bpf_object__close(obj);
+               obj = NULL;
        }
 
 cleanup:
        bpf_object__close(obj);
+       bpf_object__close(obj_iter);
 }