Adding usdt trigger bench to meassure optimized usdt probes.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
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(-)
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
On Tue, Nov 5, 2024 at 5:35 AM Jiri Olsa <jolsa@kernel.org> wrote: > > Adding usdt trigger bench to meassure optimized usdt probes. > > Signed-off-by: Jiri Olsa <jolsa@kernel.org> > --- > 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? > 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 >
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@kernel.org> wrote: > > > > Adding usdt trigger bench to meassure optimized usdt probes. > > > > Signed-off-by: Jiri Olsa <jolsa@kernel.org> > > --- > > 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 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 > >
On Sat, Nov 16, 2024 at 1:45 PM Jiri Olsa <olsajiri@gmail.com> 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@kernel.org> wrote: > > > > > > Adding usdt trigger bench to meassure optimized usdt probes. > > > > > > Signed-off-by: Jiri Olsa <jolsa@kernel.org> > > > --- > > > 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 > > >
© 2016 - 2024 Red Hat, Inc.