OSDN Git Service

selftests/bpf: Adopt attach_probe selftest to work on old kernels
authorAndrii Nakryiko <andrii@kernel.org>
Tue, 21 Sep 2021 21:00:34 +0000 (14:00 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 22 Sep 2021 02:40:09 +0000 (19:40 -0700)
Make sure to not use ref_ctr_off feature when running on old kernels
that don't support this feature. This allows to test libbpf's legacy
kprobe and uprobe logic on old kernels.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20210921210036.1545557-3-andrii@kernel.org
tools/testing/selftests/bpf/prog_tests/attach_probe.c

index bf307bb..6c511dc 100644 (file)
@@ -14,6 +14,20 @@ void test_attach_probe(void)
        struct test_attach_probe* skel;
        size_t uprobe_offset;
        ssize_t base_addr, ref_ctr_offset;
+       bool legacy;
+
+       /* Check if new-style kprobe/uprobe API is supported.
+        * Kernels that support new FD-based kprobe and uprobe BPF attachment
+        * through perf_event_open() syscall expose
+        * /sys/bus/event_source/devices/kprobe/type and
+        * /sys/bus/event_source/devices/uprobe/type files, respectively. They
+        * contain magic numbers that are passed as "type" field of
+        * perf_event_attr. Lack of such file in the system indicates legacy
+        * kernel with old-style kprobe/uprobe attach interface through
+        * creating per-probe event through tracefs. For such cases
+        * ref_ctr_offset feature is not supported, so we don't test it.
+        */
+       legacy = access("/sys/bus/event_source/devices/kprobe/type", F_OK) != 0;
 
        base_addr = get_base_addr();
        if (CHECK(base_addr < 0, "get_base_addr",
@@ -45,10 +59,11 @@ void test_attach_probe(void)
                goto cleanup;
        skel->links.handle_kretprobe = kretprobe_link;
 
-       ASSERT_EQ(uprobe_ref_ctr, 0, "uprobe_ref_ctr_before");
+       if (!legacy)
+               ASSERT_EQ(uprobe_ref_ctr, 0, "uprobe_ref_ctr_before");
 
        uprobe_opts.retprobe = false;
-       uprobe_opts.ref_ctr_offset = ref_ctr_offset;
+       uprobe_opts.ref_ctr_offset = legacy ? 0 : ref_ctr_offset;
        uprobe_link = bpf_program__attach_uprobe_opts(skel->progs.handle_uprobe,
                                                      0 /* self pid */,
                                                      "/proc/self/exe",
@@ -58,11 +73,12 @@ void test_attach_probe(void)
                goto cleanup;
        skel->links.handle_uprobe = uprobe_link;
 
-       ASSERT_GT(uprobe_ref_ctr, 0, "uprobe_ref_ctr_after");
+       if (!legacy)
+               ASSERT_GT(uprobe_ref_ctr, 0, "uprobe_ref_ctr_after");
 
        /* if uprobe uses ref_ctr, uretprobe has to use ref_ctr as well */
        uprobe_opts.retprobe = true;
-       uprobe_opts.ref_ctr_offset = ref_ctr_offset;
+       uprobe_opts.ref_ctr_offset = legacy ? 0 : ref_ctr_offset;
        uretprobe_link = bpf_program__attach_uprobe_opts(skel->progs.handle_uretprobe,
                                                         -1 /* any pid */,
                                                         "/proc/self/exe",