On Sat, Nov 16, 2024 at 1:45 PM Jiri Olsa <olsajiri@xxxxxxxxx> wrote: > > On Thu, Nov 14, 2024 at 03:40:53PM -0800, Andrii Nakryiko wrote: > > On Tue, Nov 5, 2024 at 5:35 AM Jiri Olsa <jolsa@xxxxxxxxxx> wrote: > > > > > > Adding usdt trigger bench to meassure optimized usdt probes. > > > > > > Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx> > > > --- > > > tools/testing/selftests/bpf/bench.c | 2 + > > > .../selftests/bpf/benchs/bench_trigger.c | 45 +++++++++++++++++++ > > > .../selftests/bpf/progs/trigger_bench.c | 10 ++++- > > > 3 files changed, 56 insertions(+), 1 deletion(-) > > > > > > > Why not just adding uprobe-nop5 benchmark instead of going all the way > > into USDT? Seems simpler and will benchmark all the same stuff? > > ok, perhaps with your new usdt library and the possible nop/nop5 tricks we > might want to have specific usdt benchmarks.. but that's for later anyway > meh, maybe, don't know if necessary *for benchmark*. But anyways, the USDT library is out, see [0], feel free to take a look and use [0] https://github.com/libbpf/usdt > jirka > > > > > > diff --git a/tools/testing/selftests/bpf/bench.c b/tools/testing/selftests/bpf/bench.c > > > index 1bd403a5ef7b..dc5121e49623 100644 > > > --- a/tools/testing/selftests/bpf/bench.c > > > +++ b/tools/testing/selftests/bpf/bench.c > > > @@ -526,6 +526,7 @@ extern const struct bench bench_trig_uprobe_multi_push; > > > extern const struct bench bench_trig_uretprobe_multi_push; > > > extern const struct bench bench_trig_uprobe_multi_ret; > > > extern const struct bench bench_trig_uretprobe_multi_ret; > > > +extern const struct bench bench_trig_usdt; > > > > > > extern const struct bench bench_rb_libbpf; > > > extern const struct bench bench_rb_custom; > > > @@ -586,6 +587,7 @@ static const struct bench *benchs[] = { > > > &bench_trig_uretprobe_multi_push, > > > &bench_trig_uprobe_multi_ret, > > > &bench_trig_uretprobe_multi_ret, > > > + &bench_trig_usdt, > > > /* ringbuf/perfbuf benchmarks */ > > > &bench_rb_libbpf, > > > &bench_rb_custom, > > > diff --git a/tools/testing/selftests/bpf/benchs/bench_trigger.c b/tools/testing/selftests/bpf/benchs/bench_trigger.c > > > index 32e9f194d449..bdee8b8362d0 100644 > > > --- a/tools/testing/selftests/bpf/benchs/bench_trigger.c > > > +++ b/tools/testing/selftests/bpf/benchs/bench_trigger.c > > > @@ -8,6 +8,7 @@ > > > #include "bench.h" > > > #include "trigger_bench.skel.h" > > > #include "trace_helpers.h" > > > +#include "../sdt.h" > > > > > > #define MAX_TRIG_BATCH_ITERS 1000 > > > > > > @@ -333,6 +334,13 @@ static void *uprobe_producer_ret(void *input) > > > return NULL; > > > } > > > > > > +static void *uprobe_producer_usdt(void *input) > > > +{ > > > + while (true) > > > + STAP_PROBE(trigger, usdt); > > > + return NULL; > > > +} > > > + > > > static void usetup(bool use_retprobe, bool use_multi, void *target_addr) > > > { > > > size_t uprobe_offset; > > > @@ -383,6 +391,37 @@ static void usetup(bool use_retprobe, bool use_multi, void *target_addr) > > > } > > > } > > > > > > +static void __usdt_setup(const char *provider, const char *name) > > > +{ > > > + struct bpf_link *link; > > > + int err; > > > + > > > + setup_libbpf(); > > > + > > > + ctx.skel = trigger_bench__open(); > > > + if (!ctx.skel) { > > > + fprintf(stderr, "failed to open skeleton\n"); > > > + exit(1); > > > + } > > > + > > > + bpf_program__set_autoload(ctx.skel->progs.bench_trigger_usdt, true); > > > + > > > + err = trigger_bench__load(ctx.skel); > > > + if (err) { > > > + fprintf(stderr, "failed to load skeleton\n"); > > > + exit(1); > > > + } > > > + > > > + link = bpf_program__attach_usdt(ctx.skel->progs.bench_trigger_usdt, > > > + -1 /* all PIDs */, "/proc/self/exe", > > > + provider, name, NULL); > > > + if (!link) { > > > + fprintf(stderr, "failed to attach uprobe!\n"); > > > + exit(1); > > > + } > > > + ctx.skel->links.bench_trigger_usdt = link; > > > +} > > > + > > > static void usermode_count_setup(void) > > > { > > > ctx.usermode_counters = true; > > > @@ -448,6 +487,11 @@ static void uretprobe_multi_ret_setup(void) > > > usetup(true, true /* use_multi */, &uprobe_target_ret); > > > } > > > > > > +static void usdt_setup(void) > > > +{ > > > + __usdt_setup("trigger", "usdt"); > > > +} > > > + > > > const struct bench bench_trig_syscall_count = { > > > .name = "trig-syscall-count", > > > .validate = trigger_validate, > > > @@ -506,3 +550,4 @@ BENCH_TRIG_USERMODE(uprobe_multi_ret, ret, "uprobe-multi-ret"); > > > BENCH_TRIG_USERMODE(uretprobe_multi_nop, nop, "uretprobe-multi-nop"); > > > BENCH_TRIG_USERMODE(uretprobe_multi_push, push, "uretprobe-multi-push"); > > > BENCH_TRIG_USERMODE(uretprobe_multi_ret, ret, "uretprobe-multi-ret"); > > > +BENCH_TRIG_USERMODE(usdt, usdt, "usdt"); > > > diff --git a/tools/testing/selftests/bpf/progs/trigger_bench.c b/tools/testing/selftests/bpf/progs/trigger_bench.c > > > index 044a6d78923e..7b7d4a71e7d4 100644 > > > --- a/tools/testing/selftests/bpf/progs/trigger_bench.c > > > +++ b/tools/testing/selftests/bpf/progs/trigger_bench.c > > > @@ -1,8 +1,9 @@ > > > // SPDX-License-Identifier: GPL-2.0 > > > // Copyright (c) 2020 Facebook > > > -#include <linux/bpf.h> > > > +#include "vmlinux.h" > > > #include <asm/unistd.h> > > > #include <bpf/bpf_helpers.h> > > > +#include <bpf/usdt.bpf.h> > > > #include <bpf/bpf_tracing.h> > > > #include "bpf_misc.h" > > > > > > @@ -138,3 +139,10 @@ int bench_trigger_rawtp(void *ctx) > > > inc_counter(); > > > return 0; > > > } > > > + > > > +SEC("?usdt") > > > +int bench_trigger_usdt(struct pt_regs *ctx) > > > +{ > > > + inc_counter(); > > > + return 0; > > > +} > > > -- > > > 2.47.0 > > >