selftests/bpf: Add usdt trigger bench
Adding usdt trigger bench for usdt: trig-usdt-nop - usdt on top of nop1 instruction trig-usdt-nop5 - usdt on top of nop1/nop5 combo Adding it to benchs/run_bench_uprobes.sh script. Example run on x86_64 kernel with uprobe syscall: # ./benchs/run_bench_uprobes.sh usermode-count : 152.507 ± 0.098M/s syscall-count : 14.309 ± 0.093M/s uprobe-nop : 3.190 ± 0.012M/s uprobe-push : 3.057 ± 0.004M/s uprobe-ret : 1.095 ± 0.009M/s uprobe-nop5 : 7.305 ± 0.034M/s uretprobe-nop : 2.175 ± 0.005M/s uretprobe-push : 2.109 ± 0.003M/s uretprobe-ret : 0.945 ± 0.002M/s uretprobe-nop5 : 3.530 ± 0.006M/s usdt-nop : 3.235 ± 0.008M/s <-- added usdt-nop5 : 7.511 ± 0.045M/s <-- added Signed-off-by: Jiri Olsa <jolsa@kernel.org> Link: https://lore.kernel.org/r/20260224103915.1369690-6-jolsa@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>master
parent
304841967c
commit
0c4fc6bd61
|
|
@ -879,6 +879,8 @@ $(OUTPUT)/bench: $(OUTPUT)/bench.o \
|
|||
$(OUTPUT)/bench_bpf_crypto.o \
|
||||
$(OUTPUT)/bench_sockmap.o \
|
||||
$(OUTPUT)/bench_lpm_trie_map.o \
|
||||
$(OUTPUT)/usdt_1.o \
|
||||
$(OUTPUT)/usdt_2.o \
|
||||
#
|
||||
$(call msg,BINARY,,$@)
|
||||
$(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(filter %.a %.o,$^) $(LDLIBS) -o $@
|
||||
|
|
|
|||
|
|
@ -541,6 +541,8 @@ 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;
|
||||
extern const struct bench bench_trig_usdt_nop;
|
||||
extern const struct bench bench_trig_usdt_nop5;
|
||||
#endif
|
||||
|
||||
extern const struct bench bench_rb_libbpf;
|
||||
|
|
@ -617,6 +619,8 @@ static const struct bench *benchs[] = {
|
|||
&bench_trig_uretprobe_nop5,
|
||||
&bench_trig_uprobe_multi_nop5,
|
||||
&bench_trig_uretprobe_multi_nop5,
|
||||
&bench_trig_usdt_nop,
|
||||
&bench_trig_usdt_nop5,
|
||||
#endif
|
||||
/* ringbuf/perfbuf benchmarks */
|
||||
&bench_rb_libbpf,
|
||||
|
|
|
|||
|
|
@ -407,6 +407,23 @@ static void *uprobe_producer_nop5(void *input)
|
|||
uprobe_target_nop5();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void usdt_1(void);
|
||||
void usdt_2(void);
|
||||
|
||||
static void *uprobe_producer_usdt_nop(void *input)
|
||||
{
|
||||
while (true)
|
||||
usdt_1();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void *uprobe_producer_usdt_nop5(void *input)
|
||||
{
|
||||
while (true)
|
||||
usdt_2();
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void usetup(bool use_retprobe, bool use_multi, void *target_addr)
|
||||
|
|
@ -544,6 +561,47 @@ static void uretprobe_multi_nop5_setup(void)
|
|||
{
|
||||
usetup(true, true /* use_multi */, &uprobe_target_nop5);
|
||||
}
|
||||
|
||||
static void usdt_setup(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,
|
||||
0 /*self*/, "/proc/self/exe",
|
||||
"optimized_attach", name, NULL);
|
||||
if (libbpf_get_error(link)) {
|
||||
fprintf(stderr, "failed to attach optimized_attach:%s usdt probe\n", name);
|
||||
exit(1);
|
||||
}
|
||||
ctx.skel->links.bench_trigger_usdt = link;
|
||||
}
|
||||
|
||||
static void usdt_nop_setup(void)
|
||||
{
|
||||
usdt_setup("usdt_1");
|
||||
}
|
||||
|
||||
static void usdt_nop5_setup(void)
|
||||
{
|
||||
usdt_setup("usdt_2");
|
||||
}
|
||||
#endif
|
||||
|
||||
const struct bench bench_trig_syscall_count = {
|
||||
|
|
@ -611,4 +669,6 @@ 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");
|
||||
BENCH_TRIG_USERMODE(usdt_nop, usdt_nop, "usdt-nop");
|
||||
BENCH_TRIG_USERMODE(usdt_nop5, usdt_nop5, "usdt-nop5");
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
set -eufo pipefail
|
||||
|
||||
for i in usermode-count syscall-count {uprobe,uretprobe}-{nop,push,ret,nop5}
|
||||
for i in usermode-count syscall-count {uprobe,uretprobe}-{nop,push,ret,nop5} usdt-nop usdt-nop5
|
||||
do
|
||||
summary=$(sudo ./bench -w2 -d5 -a trig-$i | tail -n1 | cut -d'(' -f1 | cut -d' ' -f3-)
|
||||
printf "%-15s: %s\n" $i "$summary"
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
// 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/bpf_tracing.h>
|
||||
#include "bpf_misc.h"
|
||||
#include "bpf/usdt.bpf.h"
|
||||
|
||||
char _license[] SEC("license") = "GPL";
|
||||
|
||||
|
|
@ -180,3 +181,10 @@ int bench_trigger_rawtp(void *ctx)
|
|||
handle(ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("?usdt")
|
||||
int bench_trigger_usdt(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue