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