// 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, };