1*08158c11SPuranjay Mohan /* SPDX-License-Identifier: GPL-2.0 */ 2*08158c11SPuranjay Mohan /* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */ 3*08158c11SPuranjay Mohan 4*08158c11SPuranjay Mohan #ifndef __BENCH_BPF_TIMING_H__ 5*08158c11SPuranjay Mohan #define __BENCH_BPF_TIMING_H__ 6*08158c11SPuranjay Mohan 7*08158c11SPuranjay Mohan #include <stdbool.h> 8*08158c11SPuranjay Mohan #include <linux/types.h> 9*08158c11SPuranjay Mohan #include "bench.h" 10*08158c11SPuranjay Mohan 11*08158c11SPuranjay Mohan #ifndef BENCH_NR_SAMPLES 12*08158c11SPuranjay Mohan #define BENCH_NR_SAMPLES 4096 13*08158c11SPuranjay Mohan #endif 14*08158c11SPuranjay Mohan #ifndef BENCH_NR_CPUS 15*08158c11SPuranjay Mohan #define BENCH_NR_CPUS 256 16*08158c11SPuranjay Mohan #endif 17*08158c11SPuranjay Mohan 18*08158c11SPuranjay Mohan typedef void (*bpf_bench_run_fn)(void *ctx); 19*08158c11SPuranjay Mohan 20*08158c11SPuranjay Mohan struct bpf_bench_timing { 21*08158c11SPuranjay Mohan __u64 (*samples)[BENCH_NR_SAMPLES]; /* skel->bss->timing_samples */ 22*08158c11SPuranjay Mohan __u32 *idx; /* skel->bss->timing_idx */ 23*08158c11SPuranjay Mohan volatile __u32 *timing_enabled; /* &skel->bss->timing_enabled */ 24*08158c11SPuranjay Mohan volatile __u32 *batch_iters_bss; /* &skel->bss->batch_iters */ 25*08158c11SPuranjay Mohan __u32 batch_iters; 26*08158c11SPuranjay Mohan __u32 target_samples; 27*08158c11SPuranjay Mohan __u32 nr_cpus; 28*08158c11SPuranjay Mohan int warmup_ticks; 29*08158c11SPuranjay Mohan bool done; 30*08158c11SPuranjay Mohan bool machine_readable; 31*08158c11SPuranjay Mohan }; 32*08158c11SPuranjay Mohan 33*08158c11SPuranjay Mohan #define BENCH_TIMING_INIT(t, skel, iters) do { \ 34*08158c11SPuranjay Mohan (t)->samples = (skel)->bss->timing_samples; \ 35*08158c11SPuranjay Mohan (t)->idx = (skel)->bss->timing_idx; \ 36*08158c11SPuranjay Mohan (t)->timing_enabled = &(skel)->bss->timing_enabled; \ 37*08158c11SPuranjay Mohan (t)->batch_iters_bss = &(skel)->bss->batch_iters; \ 38*08158c11SPuranjay Mohan (t)->batch_iters = (iters); \ 39*08158c11SPuranjay Mohan (t)->target_samples = 200; \ 40*08158c11SPuranjay Mohan (t)->nr_cpus = env.nr_cpus; \ 41*08158c11SPuranjay Mohan (t)->warmup_ticks = 0; \ 42*08158c11SPuranjay Mohan (t)->done = false; \ 43*08158c11SPuranjay Mohan (t)->machine_readable = false; \ 44*08158c11SPuranjay Mohan } while (0) 45*08158c11SPuranjay Mohan 46*08158c11SPuranjay Mohan void bpf_bench_timing_measure(struct bpf_bench_timing *t, struct bench_res *res); 47*08158c11SPuranjay Mohan void bpf_bench_timing_report(struct bpf_bench_timing *t, const char *name, const char *desc); 48*08158c11SPuranjay Mohan void bpf_bench_calibrate(struct bpf_bench_timing *t, bpf_bench_run_fn run_fn, void *ctx); 49*08158c11SPuranjay Mohan 50*08158c11SPuranjay Mohan #endif /* __BENCH_BPF_TIMING_H__ */ 51