Adding simple test that loads fentry tracing programs to
bpf_fentry_test* functions and uses trampoline_attach_batch
bool in struct bpf_object_open_opts to attach them in batch
mode.

Signed-off-by: Jiri Olsa <jo...@kernel.org>
---
 .../bpf/prog_tests/trampoline_batch.c         | 45 +++++++++++
 .../bpf/progs/trampoline_batch_test.c         | 75 +++++++++++++++++++
 2 files changed, 120 insertions(+)
 create mode 100644 tools/testing/selftests/bpf/prog_tests/trampoline_batch.c
 create mode 100644 tools/testing/selftests/bpf/progs/trampoline_batch_test.c

diff --git a/tools/testing/selftests/bpf/prog_tests/trampoline_batch.c 
b/tools/testing/selftests/bpf/prog_tests/trampoline_batch.c
new file mode 100644
index 000000000000..98929ac0bef6
--- /dev/null
+++ b/tools/testing/selftests/bpf/prog_tests/trampoline_batch.c
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2019 Facebook */
+#include <test_progs.h>
+#include "trampoline_batch_test.skel.h"
+
+void test_trampoline_batch(void)
+{
+       DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts);
+       struct trampoline_batch_test *skel = NULL;
+       int err, prog_fd, i;
+       __u32 duration = 0, retval;
+       __u64 *result;
+
+       opts.trampoline_attach_batch = true;
+
+       skel = trampoline_batch_test__open_opts(&opts);
+       if (CHECK(!skel, "skel_open", "open failed\n"))
+               goto cleanup;
+
+       err = trampoline_batch_test__load(skel);
+       if (CHECK(err, "skel_load", "load failed: %d\n", err))
+               goto cleanup;
+
+       err = trampoline_batch_test__attach(skel);
+       if (CHECK(err, "skel_attach", "attach failed: %d\n", err))
+               goto cleanup;
+
+       prog_fd = bpf_program__fd(skel->progs.test1);
+       err = bpf_prog_test_run(prog_fd, 1, NULL, 0,
+                               NULL, NULL, &retval, &duration);
+       CHECK(err || retval, "test_run",
+             "err %d errno %d retval %d duration %d\n",
+             err, errno, retval, duration);
+
+       result = (__u64 *)skel->bss;
+       for (i = 0; i < 6; i++) {
+               if (CHECK(result[i] != 1, "result",
+                         "trampoline_batch_test fentry_test%d failed err 
%lld\n",
+                         i + 1, result[i]))
+                       goto cleanup;
+       }
+
+cleanup:
+       trampoline_batch_test__destroy(skel);
+}
diff --git a/tools/testing/selftests/bpf/progs/trampoline_batch_test.c 
b/tools/testing/selftests/bpf/progs/trampoline_batch_test.c
new file mode 100644
index 000000000000..ff93799037f0
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/trampoline_batch_test.c
@@ -0,0 +1,75 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2019 Facebook */
+#include <linux/bpf.h>
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+
+char _license[] SEC("license") = "GPL";
+
+__u64 test1_result = 0;
+SEC("fentry/bpf_fentry_test1")
+int BPF_PROG(test1, int a)
+{
+       test1_result = 1;
+       return 0;
+}
+
+__u64 test2_result = 0;
+SEC("fentry/bpf_fentry_test2")
+int BPF_PROG(test2, int a, __u64 b)
+{
+       test2_result = 1;
+       return 0;
+}
+
+__u64 test3_result = 0;
+SEC("fentry/bpf_fentry_test3")
+int BPF_PROG(test3, char a, int b, __u64 c)
+{
+       test3_result = 1;
+       return 0;
+}
+
+__u64 test4_result = 0;
+SEC("fentry/bpf_fentry_test4")
+int BPF_PROG(test4, void *a, char b, int c, __u64 d)
+{
+       test4_result = 1;
+       return 0;
+}
+
+__u64 test5_result = 0;
+SEC("fentry/bpf_fentry_test5")
+int BPF_PROG(test5, __u64 a, void *b, short c, int d, __u64 e)
+{
+       test5_result = 1;
+       return 0;
+}
+
+__u64 test6_result = 0;
+SEC("fentry/bpf_fentry_test6")
+int BPF_PROG(test6, __u64 a, void *b, short c, int d, void * e, __u64 f)
+{
+       test6_result = 1;
+       return 0;
+}
+
+struct bpf_fentry_test_t {
+       struct bpf_fentry_test_t *a;
+};
+
+__u64 test7_result = 0;
+SEC("fentry/bpf_fentry_test7")
+int BPF_PROG(test7, struct bpf_fentry_test_t *arg)
+{
+       test7_result = 1;
+       return 0;
+}
+
+__u64 test8_result = 0;
+SEC("fentry/bpf_fentry_test8")
+int BPF_PROG(test8, struct bpf_fentry_test_t *arg)
+{
+       test8_result = 1;
+       return 0;
+}
-- 
2.26.2

Reply via email to