mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
selftests/bpf: Add bpf-nop benchmark for timing overhead baseline
Add a minimal benchmark that measures the overhead of the batch-timing infrastructure itself. The BPF program runs an empty BENCH_BPF_LOOP body (~1.5-2 ns/op), establishing the floor cost that all timing-library benchmarks include. [root@virtme-ng tools/testing/selftests/bpf]# sudo ./bench -a -p8 bpf-nop Setting up benchmark 'bpf-nop'... Benchmark 'bpf-nop' started. bpf-nop: median 1.82 ns/op, stddev 0.01, p99 1.86 (1754 samples) Signed-off-by: Puranjay Mohan <puranjay@kernel.org> Link: https://lore.kernel.org/r/20260427232313.1582588-4-puranjay@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
08158c111d
commit
dcf11479c2
|
|
@ -906,6 +906,7 @@ $(OUTPUT)/bench_htab_mem.o: $(OUTPUT)/htab_mem_bench.skel.h
|
|||
$(OUTPUT)/bench_bpf_crypto.o: $(OUTPUT)/crypto_bench.skel.h
|
||||
$(OUTPUT)/bench_sockmap.o: $(OUTPUT)/bench_sockmap_prog.skel.h
|
||||
$(OUTPUT)/bench_lpm_trie_map.o: $(OUTPUT)/lpm_trie_bench.skel.h $(OUTPUT)/lpm_trie_map.skel.h
|
||||
$(OUTPUT)/bench_bpf_nop.o: $(OUTPUT)/bpf_nop_bench.skel.h bench_bpf_timing.h
|
||||
$(OUTPUT)/bench_bpf_timing.o: bench_bpf_timing.h
|
||||
$(OUTPUT)/bench.o: bench.h testing_helpers.h $(BPFOBJ)
|
||||
$(OUTPUT)/bench: LDLIBS += -lm
|
||||
|
|
@ -930,6 +931,7 @@ $(OUTPUT)/bench: $(OUTPUT)/bench.o \
|
|||
$(OUTPUT)/bench_sockmap.o \
|
||||
$(OUTPUT)/bench_lpm_trie_map.o \
|
||||
$(OUTPUT)/bench_bpf_timing.o \
|
||||
$(OUTPUT)/bench_bpf_nop.o \
|
||||
$(OUTPUT)/usdt_1.o \
|
||||
$(OUTPUT)/usdt_2.o \
|
||||
#
|
||||
|
|
|
|||
|
|
@ -575,6 +575,7 @@ extern const struct bench bench_lpm_trie_insert;
|
|||
extern const struct bench bench_lpm_trie_update;
|
||||
extern const struct bench bench_lpm_trie_delete;
|
||||
extern const struct bench bench_lpm_trie_free;
|
||||
extern const struct bench bench_bpf_nop;
|
||||
|
||||
static const struct bench *benchs[] = {
|
||||
&bench_count_global,
|
||||
|
|
@ -653,6 +654,7 @@ static const struct bench *benchs[] = {
|
|||
&bench_lpm_trie_update,
|
||||
&bench_lpm_trie_delete,
|
||||
&bench_lpm_trie_free,
|
||||
&bench_bpf_nop,
|
||||
};
|
||||
|
||||
static void find_benchmark(void)
|
||||
|
|
|
|||
84
tools/testing/selftests/bpf/benchs/bench_bpf_nop.c
Normal file
84
tools/testing/selftests/bpf/benchs/bench_bpf_nop.c
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
|
||||
|
||||
#include "bench.h"
|
||||
#include "bench_bpf_timing.h"
|
||||
#include "bpf_nop_bench.skel.h"
|
||||
#include "bpf_util.h"
|
||||
|
||||
static struct ctx {
|
||||
struct bpf_nop_bench *skel;
|
||||
struct bpf_bench_timing timing;
|
||||
int prog_fd;
|
||||
} ctx;
|
||||
|
||||
static void nop_validate(void)
|
||||
{
|
||||
if (env.consumer_cnt != 0) {
|
||||
fprintf(stderr, "benchmark doesn't support consumers\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
static void nop_run_once(void *unused __always_unused)
|
||||
{
|
||||
LIBBPF_OPTS(bpf_test_run_opts, topts);
|
||||
|
||||
bpf_prog_test_run_opts(ctx.prog_fd, &topts);
|
||||
}
|
||||
|
||||
static void nop_setup(void)
|
||||
{
|
||||
struct bpf_nop_bench *skel;
|
||||
int err;
|
||||
|
||||
setup_libbpf();
|
||||
|
||||
skel = bpf_nop_bench__open();
|
||||
if (!skel) {
|
||||
fprintf(stderr, "failed to open skeleton\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
err = bpf_nop_bench__load(skel);
|
||||
if (err) {
|
||||
fprintf(stderr, "failed to load skeleton: %s\n", strerror(-err));
|
||||
bpf_nop_bench__destroy(skel);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
ctx.skel = skel;
|
||||
ctx.prog_fd = bpf_program__fd(skel->progs.bench_nop);
|
||||
|
||||
BENCH_TIMING_INIT(&ctx.timing, skel, 0);
|
||||
bpf_bench_calibrate(&ctx.timing, nop_run_once, NULL);
|
||||
|
||||
env.duration_sec = 600;
|
||||
}
|
||||
|
||||
static void *nop_producer(void *input)
|
||||
{
|
||||
while (true)
|
||||
nop_run_once(NULL);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void nop_measure(struct bench_res *res)
|
||||
{
|
||||
bpf_bench_timing_measure(&ctx.timing, res);
|
||||
}
|
||||
|
||||
static void nop_report_final(struct bench_res res[], int res_cnt)
|
||||
{
|
||||
bpf_bench_timing_report(&ctx.timing, "bpf-nop", NULL);
|
||||
}
|
||||
|
||||
const struct bench bench_bpf_nop = {
|
||||
.name = "bpf-nop",
|
||||
.validate = nop_validate,
|
||||
.setup = nop_setup,
|
||||
.producer_thread = nop_producer,
|
||||
.measure = nop_measure,
|
||||
.report_final = nop_report_final,
|
||||
};
|
||||
14
tools/testing/selftests/bpf/progs/bpf_nop_bench.c
Normal file
14
tools/testing/selftests/bpf/progs/bpf_nop_bench.c
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
|
||||
|
||||
#include <linux/bpf.h>
|
||||
#include <bpf/bpf_helpers.h>
|
||||
#include "bench_bpf_timing.bpf.h"
|
||||
|
||||
SEC("syscall")
|
||||
int bench_nop(void *ctx)
|
||||
{
|
||||
return BENCH_BPF_LOOP(0, ({}));
|
||||
}
|
||||
|
||||
char _license[] SEC("license") = "GPL";
|
||||
Loading…
Reference in New Issue
Block a user