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

Reply via email to