xref: /linux/tools/testing/selftests/bpf/bench_bpf_timing.h (revision 0eaed89c18aeedf0898baf2dbf5ff027c6795152)
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