On Tue, Mar 17, 2026 at 11:09:26AM +0800, Leon Hwang wrote:
> On 16/3/26 15:51, Jiri Olsa wrote:
> > Adding benchmark test that attaches to (almost) all allowed tracing
> > functions and display attach/detach times.
> >
> > # ./test_progs -t tracing_multi_bench_attach -v
> > bpf_testmod.ko is already unloaded.
> > Loading bpf_testmod.ko...
> > Successfully loaded bpf_testmod.ko.
> > serial_test_tracing_multi_bench_attach:PASS:btf__load_vmlinux_btf 0 nsec
> >
> > serial_test_tracing_multi_bench_attach:PASS:tracing_multi_bench__open_and_load
> > 0 nsec
> > serial_test_tracing_multi_bench_attach:PASS:get_syms 0 nsec
> >
> > serial_test_tracing_multi_bench_attach:PASS:bpf_program__attach_tracing_multi
> > 0 nsec
> > serial_test_tracing_multi_bench_attach: found 51186 functions
> > serial_test_tracing_multi_bench_attach: attached in 1.295s
> > serial_test_tracing_multi_bench_attach: detached in 0.243s
> > #507 tracing_multi_bench_attach:OK
> > Summary: 1/0 PASSED, 0 SKIPPED, 0 FAILED
> > Successfully unloaded bpf_testmod.ko.
> >
> > Exporting skip_entry as is_unsafe_function and usign it in the test.
> ^ using
yes
SNIP
> > +void serial_test_tracing_multi_bench_attach(void)
> > +{
> > + LIBBPF_OPTS(bpf_tracing_multi_opts, opts);
> > + struct tracing_multi_bench *skel = NULL;
> > + long attach_start_ns, attach_end_ns;
> > + long detach_start_ns, detach_end_ns;
> > + double attach_delta, detach_delta;
> > + struct bpf_link *link = NULL;
> > + size_t i, cap = 0, cnt = 0;
> > + struct ksyms *ksyms = NULL;
> > + void *root = NULL;
> > + __u32 *ids = NULL;
> > + __u32 nr, type_id;
> > + struct btf *btf;
> > + int err;
> > +
> > +#ifndef __x86_64__
> > + test__skip();
> > + return;
> > +#endif
> > +
> > + btf = btf__load_vmlinux_btf();
> > + if (!ASSERT_OK_PTR(btf, "btf__load_vmlinux_btf"))
> > + return;
> > +
> > + skel = tracing_multi_bench__open_and_load();
> > + if (!ASSERT_OK_PTR(skel, "tracing_multi_bench__open_and_load"))
> > + goto cleanup;
> > +
> > + if (!ASSERT_OK(bpf_get_ksyms(&ksyms, true), "get_syms"))
> > + goto cleanup;
> > +
> > + /* Get all ftrace 'safe' symbols.. */
> > + for (i = 0; i < ksyms->filtered_cnt; i++) {
> > + if (is_unsafe_function(ksyms->filtered_syms[i]))
> > + continue;
> > + tsearch(&ksyms->filtered_syms[i], &root, compare);
> ^ missing tdestroy() to free tree nodes?
right, will add
SNIP
> > void test_tracing_multi_test(void)
> > {
> > #ifndef __x86_64__
> > diff --git a/tools/testing/selftests/bpf/progs/tracing_multi_bench.c
> > b/tools/testing/selftests/bpf/progs/tracing_multi_bench.c
> > new file mode 100644
> > index 000000000000..067ba668489b
> > --- /dev/null
> > +++ b/tools/testing/selftests/bpf/progs/tracing_multi_bench.c
> > @@ -0,0 +1,13 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +#include <stdbool.h>
> > +#include <linux/bpf.h>
> > +#include <bpf/bpf_helpers.h>
> > +#include <bpf/bpf_tracing.h>
> > +
> > +char _license[] SEC("license") = "GPL";
> > +
> > +SEC("fentry.multi")
> > +int BPF_PROG(bench)
> > +{
> > + return 0;
> > +}
> > diff --git a/tools/testing/selftests/bpf/trace_helpers.c
> > b/tools/testing/selftests/bpf/trace_helpers.c
> > index 0e63daf83ed5..3bf600f3271b 100644
> > --- a/tools/testing/selftests/bpf/trace_helpers.c
> > +++ b/tools/testing/selftests/bpf/trace_helpers.c
> > @@ -548,7 +548,7 @@ static const char * const trace_blacklist[] = {
> > "bpf_get_numa_node_id",
> > };
> >
> > -static bool skip_entry(char *name)
> > +bool is_unsafe_function(char *name)
> NIT: ^ should const char * ?
sure, will change, thanks
jirka