Message ID | 20241211133403.208920-14-jolsa@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | uprobes: Add support to optimize usdt probes on x86_64 | expand |
On Wed, Dec 11, 2024 at 5:36 AM Jiri Olsa <jolsa@kernel.org> wrote: > > Add 5-byte nop uprobe trigger bench (x86_64 specific) to measure > uprobes/uretprobes on top of nop5 instruction. > > Signed-off-by: Jiri Olsa <jolsa@kernel.org> > --- > tools/testing/selftests/bpf/bench.c | 12 ++++++ > .../selftests/bpf/benchs/bench_trigger.c | 42 +++++++++++++++++++ > .../selftests/bpf/benchs/run_bench_uprobes.sh | 2 +- > 3 files changed, 55 insertions(+), 1 deletion(-) > [...] > static void usetup(bool use_retprobe, bool use_multi, void *target_addr) > { > size_t uprobe_offset; > @@ -448,6 +462,28 @@ static void uretprobe_multi_ret_setup(void) > usetup(true, true /* use_multi */, &uprobe_target_ret); > } > > +#ifdef __x86_64__ > +static void uprobe_nop5_setup(void) > +{ > + usetup(false, false /* !use_multi */, &uprobe_target_nop5); > +} > + > +static void uretprobe_nop5_setup(void) > +{ > + usetup(false, false /* !use_multi */, &uprobe_target_nop5); > +} true /* use_retprobe */ that's the problem with bench setup, right? > + > +static void uprobe_multi_nop5_setup(void) > +{ > + usetup(false, true /* use_multi */, &uprobe_target_nop5); > +} > + > +static void uretprobe_multi_nop5_setup(void) > +{ > + usetup(false, true /* use_multi */, &uprobe_target_nop5); > +} > +#endif > + > const struct bench bench_trig_syscall_count = { > .name = "trig-syscall-count", > .validate = trigger_validate, [...]
On Fri, Dec 13, 2024 at 01:57:56PM -0800, Andrii Nakryiko wrote: > On Wed, Dec 11, 2024 at 5:36 AM Jiri Olsa <jolsa@kernel.org> wrote: > > > > Add 5-byte nop uprobe trigger bench (x86_64 specific) to measure > > uprobes/uretprobes on top of nop5 instruction. > > > > Signed-off-by: Jiri Olsa <jolsa@kernel.org> > > --- > > tools/testing/selftests/bpf/bench.c | 12 ++++++ > > .../selftests/bpf/benchs/bench_trigger.c | 42 +++++++++++++++++++ > > .../selftests/bpf/benchs/run_bench_uprobes.sh | 2 +- > > 3 files changed, 55 insertions(+), 1 deletion(-) > > > > [...] > > > static void usetup(bool use_retprobe, bool use_multi, void *target_addr) > > { > > size_t uprobe_offset; > > @@ -448,6 +462,28 @@ static void uretprobe_multi_ret_setup(void) > > usetup(true, true /* use_multi */, &uprobe_target_ret); > > } > > > > +#ifdef __x86_64__ > > +static void uprobe_nop5_setup(void) > > +{ > > + usetup(false, false /* !use_multi */, &uprobe_target_nop5); > > +} > > + > > +static void uretprobe_nop5_setup(void) > > +{ > > + usetup(false, false /* !use_multi */, &uprobe_target_nop5); > > +} > > true /* use_retprobe */ > > that's the problem with bench setup, right? yes, but there's more ;-) we also need change in arch_uretprobe_hijack_return_addr to skip the extra 3 values (pushed on stack by the uprobe trampoline) when hijacking the returm value, I'll send new version jirka > > > + > > +static void uprobe_multi_nop5_setup(void) > > +{ > > + usetup(false, true /* use_multi */, &uprobe_target_nop5); > > +} > > + > > +static void uretprobe_multi_nop5_setup(void) > > +{ > > + usetup(false, true /* use_multi */, &uprobe_target_nop5); > > +} > > +#endif > > + > > const struct bench bench_trig_syscall_count = { > > .name = "trig-syscall-count", > > .validate = trigger_validate, > > [...]
diff --git a/tools/testing/selftests/bpf/bench.c b/tools/testing/selftests/bpf/bench.c index 1bd403a5ef7b..0fd8c9b0d38f 100644 --- a/tools/testing/selftests/bpf/bench.c +++ b/tools/testing/selftests/bpf/bench.c @@ -526,6 +526,12 @@ 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; +#ifdef __x86_64__ +extern const struct bench bench_trig_uprobe_nop5; +extern const struct bench bench_trig_uretprobe_nop5; +extern const struct bench bench_trig_uprobe_multi_nop5; +extern const struct bench bench_trig_uretprobe_multi_nop5; +#endif extern const struct bench bench_rb_libbpf; extern const struct bench bench_rb_custom; @@ -586,6 +592,12 @@ static const struct bench *benchs[] = { &bench_trig_uretprobe_multi_push, &bench_trig_uprobe_multi_ret, &bench_trig_uretprobe_multi_ret, +#ifdef __x86_64__ + &bench_trig_uprobe_nop5, + &bench_trig_uretprobe_nop5, + &bench_trig_uprobe_multi_nop5, + &bench_trig_uretprobe_multi_nop5, +#endif /* 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..e74289a3270b 100644 --- a/tools/testing/selftests/bpf/benchs/bench_trigger.c +++ b/tools/testing/selftests/bpf/benchs/bench_trigger.c @@ -333,6 +333,20 @@ static void *uprobe_producer_ret(void *input) return NULL; } +#ifdef __x86_64__ +__nocf_check __weak void uprobe_target_nop5(void) +{ + asm volatile (".byte 0x0f, 0x1f, 0x44, 0x00, 0x00"); +} + +static void *uprobe_producer_nop5(void *input) +{ + while (true) + uprobe_target_nop5(); + return NULL; +} +#endif + static void usetup(bool use_retprobe, bool use_multi, void *target_addr) { size_t uprobe_offset; @@ -448,6 +462,28 @@ static void uretprobe_multi_ret_setup(void) usetup(true, true /* use_multi */, &uprobe_target_ret); } +#ifdef __x86_64__ +static void uprobe_nop5_setup(void) +{ + usetup(false, false /* !use_multi */, &uprobe_target_nop5); +} + +static void uretprobe_nop5_setup(void) +{ + usetup(false, false /* !use_multi */, &uprobe_target_nop5); +} + +static void uprobe_multi_nop5_setup(void) +{ + usetup(false, true /* use_multi */, &uprobe_target_nop5); +} + +static void uretprobe_multi_nop5_setup(void) +{ + usetup(false, true /* use_multi */, &uprobe_target_nop5); +} +#endif + const struct bench bench_trig_syscall_count = { .name = "trig-syscall-count", .validate = trigger_validate, @@ -506,3 +542,9 @@ 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"); +#ifdef __x86_64__ +BENCH_TRIG_USERMODE(uprobe_nop5, nop5, "uprobe-nop5"); +BENCH_TRIG_USERMODE(uretprobe_nop5, nop5, "uretprobe-nop5"); +BENCH_TRIG_USERMODE(uprobe_multi_nop5, nop5, "uprobe-multi-nop5"); +BENCH_TRIG_USERMODE(uretprobe_multi_nop5, nop5, "uretprobe-multi-nop5"); +#endif diff --git a/tools/testing/selftests/bpf/benchs/run_bench_uprobes.sh b/tools/testing/selftests/bpf/benchs/run_bench_uprobes.sh index af169f831f2f..03f55405484b 100755 --- a/tools/testing/selftests/bpf/benchs/run_bench_uprobes.sh +++ b/tools/testing/selftests/bpf/benchs/run_bench_uprobes.sh @@ -2,7 +2,7 @@ set -eufo pipefail -for i in usermode-count syscall-count {uprobe,uretprobe}-{nop,push,ret} +for i in usermode-count syscall-count {uprobe,uretprobe}-{nop,push,ret,nop5} do summary=$(sudo ./bench -w2 -d5 -a trig-$i | tail -n1 | cut -d'(' -f1 | cut -d' ' -f3-) printf "%-15s: %s\n" $i "$summary"
Add 5-byte nop uprobe trigger bench (x86_64 specific) to measure uprobes/uretprobes on top of nop5 instruction. Signed-off-by: Jiri Olsa <jolsa@kernel.org> --- tools/testing/selftests/bpf/bench.c | 12 ++++++ .../selftests/bpf/benchs/bench_trigger.c | 42 +++++++++++++++++++ .../selftests/bpf/benchs/run_bench_uprobes.sh | 2 +- 3 files changed, 55 insertions(+), 1 deletion(-)