xref: /linux/tools/testing/selftests/bpf/benchs/bench_bpf_nop.c (revision dcf11479c2a8d3520953e8366f587ec2a36505a8)
1*dcf11479SPuranjay Mohan // SPDX-License-Identifier: GPL-2.0
2*dcf11479SPuranjay Mohan /* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
3*dcf11479SPuranjay Mohan 
4*dcf11479SPuranjay Mohan #include "bench.h"
5*dcf11479SPuranjay Mohan #include "bench_bpf_timing.h"
6*dcf11479SPuranjay Mohan #include "bpf_nop_bench.skel.h"
7*dcf11479SPuranjay Mohan #include "bpf_util.h"
8*dcf11479SPuranjay Mohan 
9*dcf11479SPuranjay Mohan static struct ctx {
10*dcf11479SPuranjay Mohan 	struct bpf_nop_bench *skel;
11*dcf11479SPuranjay Mohan 	struct bpf_bench_timing timing;
12*dcf11479SPuranjay Mohan 	int prog_fd;
13*dcf11479SPuranjay Mohan } ctx;
14*dcf11479SPuranjay Mohan 
15*dcf11479SPuranjay Mohan static void nop_validate(void)
16*dcf11479SPuranjay Mohan {
17*dcf11479SPuranjay Mohan 	if (env.consumer_cnt != 0) {
18*dcf11479SPuranjay Mohan 		fprintf(stderr, "benchmark doesn't support consumers\n");
19*dcf11479SPuranjay Mohan 		exit(1);
20*dcf11479SPuranjay Mohan 	}
21*dcf11479SPuranjay Mohan }
22*dcf11479SPuranjay Mohan 
23*dcf11479SPuranjay Mohan static void nop_run_once(void *unused __always_unused)
24*dcf11479SPuranjay Mohan {
25*dcf11479SPuranjay Mohan 	LIBBPF_OPTS(bpf_test_run_opts, topts);
26*dcf11479SPuranjay Mohan 
27*dcf11479SPuranjay Mohan 	bpf_prog_test_run_opts(ctx.prog_fd, &topts);
28*dcf11479SPuranjay Mohan }
29*dcf11479SPuranjay Mohan 
30*dcf11479SPuranjay Mohan static void nop_setup(void)
31*dcf11479SPuranjay Mohan {
32*dcf11479SPuranjay Mohan 	struct bpf_nop_bench *skel;
33*dcf11479SPuranjay Mohan 	int err;
34*dcf11479SPuranjay Mohan 
35*dcf11479SPuranjay Mohan 	setup_libbpf();
36*dcf11479SPuranjay Mohan 
37*dcf11479SPuranjay Mohan 	skel = bpf_nop_bench__open();
38*dcf11479SPuranjay Mohan 	if (!skel) {
39*dcf11479SPuranjay Mohan 		fprintf(stderr, "failed to open skeleton\n");
40*dcf11479SPuranjay Mohan 		exit(1);
41*dcf11479SPuranjay Mohan 	}
42*dcf11479SPuranjay Mohan 
43*dcf11479SPuranjay Mohan 	err = bpf_nop_bench__load(skel);
44*dcf11479SPuranjay Mohan 	if (err) {
45*dcf11479SPuranjay Mohan 		fprintf(stderr, "failed to load skeleton: %s\n", strerror(-err));
46*dcf11479SPuranjay Mohan 		bpf_nop_bench__destroy(skel);
47*dcf11479SPuranjay Mohan 		exit(1);
48*dcf11479SPuranjay Mohan 	}
49*dcf11479SPuranjay Mohan 
50*dcf11479SPuranjay Mohan 	ctx.skel = skel;
51*dcf11479SPuranjay Mohan 	ctx.prog_fd = bpf_program__fd(skel->progs.bench_nop);
52*dcf11479SPuranjay Mohan 
53*dcf11479SPuranjay Mohan 	BENCH_TIMING_INIT(&ctx.timing, skel, 0);
54*dcf11479SPuranjay Mohan 	bpf_bench_calibrate(&ctx.timing, nop_run_once, NULL);
55*dcf11479SPuranjay Mohan 
56*dcf11479SPuranjay Mohan 	env.duration_sec = 600;
57*dcf11479SPuranjay Mohan }
58*dcf11479SPuranjay Mohan 
59*dcf11479SPuranjay Mohan static void *nop_producer(void *input)
60*dcf11479SPuranjay Mohan {
61*dcf11479SPuranjay Mohan 	while (true)
62*dcf11479SPuranjay Mohan 		nop_run_once(NULL);
63*dcf11479SPuranjay Mohan 
64*dcf11479SPuranjay Mohan 	return NULL;
65*dcf11479SPuranjay Mohan }
66*dcf11479SPuranjay Mohan 
67*dcf11479SPuranjay Mohan static void nop_measure(struct bench_res *res)
68*dcf11479SPuranjay Mohan {
69*dcf11479SPuranjay Mohan 	bpf_bench_timing_measure(&ctx.timing, res);
70*dcf11479SPuranjay Mohan }
71*dcf11479SPuranjay Mohan 
72*dcf11479SPuranjay Mohan static void nop_report_final(struct bench_res res[], int res_cnt)
73*dcf11479SPuranjay Mohan {
74*dcf11479SPuranjay Mohan 	bpf_bench_timing_report(&ctx.timing, "bpf-nop", NULL);
75*dcf11479SPuranjay Mohan }
76*dcf11479SPuranjay Mohan 
77*dcf11479SPuranjay Mohan const struct bench bench_bpf_nop = {
78*dcf11479SPuranjay Mohan 	.name		= "bpf-nop",
79*dcf11479SPuranjay Mohan 	.validate	= nop_validate,
80*dcf11479SPuranjay Mohan 	.setup		= nop_setup,
81*dcf11479SPuranjay Mohan 	.producer_thread = nop_producer,
82*dcf11479SPuranjay Mohan 	.measure	= nop_measure,
83*dcf11479SPuranjay Mohan 	.report_final	= nop_report_final,
84*dcf11479SPuranjay Mohan };
85