selftests/bpf: Add fill_link_info test for perf event
authorJiri Olsa <jolsa@kernel.org>
Fri, 19 Jan 2024 11:05:03 +0000 (12:05 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 24 Jan 2024 00:05:28 +0000 (16:05 -0800)
Adding fill_link_info test for perf event and testing we
get its values back through the bpf_link_info interface.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20240119110505.400573-7-jolsa@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/fill_link_info.c
tools/testing/selftests/bpf/progs/test_fill_link_info.c

index 20e105001bc33a9918e60ca173b3e8e05d0279da..f3932941bbaafc6b559e6af099cfdfc2bb19d131 100644 (file)
@@ -109,6 +109,11 @@ again:
                              strlen(UPROBE_FILE));
                        ASSERT_EQ(err, 0, "cmp_file_name");
                break;
+       case BPF_PERF_EVENT_EVENT:
+               ASSERT_EQ(info.perf_event.event.type, PERF_TYPE_SOFTWARE, "event_type");
+               ASSERT_EQ(info.perf_event.event.config, PERF_COUNT_SW_PAGE_FAULTS, "event_config");
+               ASSERT_EQ(info.perf_event.event.cookie, PERF_EVENT_COOKIE, "event_cookie");
+               break;
        default:
                err = -1;
                break;
@@ -189,6 +194,39 @@ static void test_tp_fill_link_info(struct test_fill_link_info *skel)
        bpf_link__destroy(link);
 }
 
+static void test_event_fill_link_info(struct test_fill_link_info *skel)
+{
+       DECLARE_LIBBPF_OPTS(bpf_perf_event_opts, opts,
+               .bpf_cookie = PERF_EVENT_COOKIE,
+       );
+       struct bpf_link *link;
+       int link_fd, err, pfd;
+       struct perf_event_attr attr = {
+               .type = PERF_TYPE_SOFTWARE,
+               .config = PERF_COUNT_SW_PAGE_FAULTS,
+               .freq = 1,
+               .sample_freq = 1,
+               .size = sizeof(struct perf_event_attr),
+       };
+
+       pfd = syscall(__NR_perf_event_open, &attr, -1 /* pid */, 0 /* cpu 0 */,
+                     -1 /* group id */, 0 /* flags */);
+       if (!ASSERT_GE(pfd, 0, "perf_event_open"))
+               return;
+
+       link = bpf_program__attach_perf_event_opts(skel->progs.event_run, pfd, &opts);
+       if (!ASSERT_OK_PTR(link, "attach_event"))
+               goto error;
+
+       link_fd = bpf_link__fd(link);
+       err = verify_perf_link_info(link_fd, BPF_PERF_EVENT_EVENT, 0, 0, 0);
+       ASSERT_OK(err, "verify_perf_link_info");
+       bpf_link__destroy(link);
+
+error:
+       close(pfd);
+}
+
 static void test_uprobe_fill_link_info(struct test_fill_link_info *skel,
                                       enum bpf_perf_event_type type)
 {
@@ -549,6 +587,8 @@ void test_fill_link_info(void)
                test_kprobe_fill_link_info(skel, BPF_PERF_EVENT_KPROBE, true);
        if (test__start_subtest("tracepoint_link_info"))
                test_tp_fill_link_info(skel);
+       if (test__start_subtest("event_link_info"))
+               test_event_fill_link_info(skel);
 
        uprobe_offset = get_uprobe_offset(&uprobe_func);
        if (test__start_subtest("uprobe_link_info"))
index 69509f8bb680f838262bea2b24ba6e9a1f023a00..6afa834756e9fdd87a1f824ec8c63b2b48fe0408 100644 (file)
@@ -33,6 +33,12 @@ int BPF_PROG(tp_run)
        return 0;
 }
 
+SEC("perf_event")
+int event_run(void *ctx)
+{
+       return 0;
+}
+
 SEC("kprobe.multi")
 int BPF_PROG(kmulti_run)
 {