1// SPDX-License-Identifier: GPL-2.0
2/* Copyright (c) 2022 Bytedance */
3
4#include "bench.h"
5#include "bpf_hashmap_full_update_bench.skel.h"
6#include "bpf_util.h"
7
8/* BPF triggering benchmarks */
9static struct ctx {
10	struct bpf_hashmap_full_update_bench *skel;
11} ctx;
12
13#define MAX_LOOP_NUM 10000
14
15static void validate(void)
16{
17	if (env.consumer_cnt != 0) {
18		fprintf(stderr, "benchmark doesn't support consumer!\n");
19		exit(1);
20	}
21}
22
23static void *producer(void *input)
24{
25	while (true) {
26		/* trigger the bpf program */
27		syscall(__NR_getpgid);
28	}
29
30	return NULL;
31}
32
33static void measure(struct bench_res *res)
34{
35}
36
37static void setup(void)
38{
39	struct bpf_link *link;
40	int map_fd, i, max_entries;
41
42	setup_libbpf();
43
44	ctx.skel = bpf_hashmap_full_update_bench__open_and_load();
45	if (!ctx.skel) {
46		fprintf(stderr, "failed to open skeleton\n");
47		exit(1);
48	}
49
50	ctx.skel->bss->nr_loops = MAX_LOOP_NUM;
51
52	link = bpf_program__attach(ctx.skel->progs.benchmark);
53	if (!link) {
54		fprintf(stderr, "failed to attach program!\n");
55		exit(1);
56	}
57
58	/* fill hash_map */
59	map_fd = bpf_map__fd(ctx.skel->maps.hash_map_bench);
60	max_entries = bpf_map__max_entries(ctx.skel->maps.hash_map_bench);
61	for (i = 0; i < max_entries; i++)
62		bpf_map_update_elem(map_fd, &i, &i, BPF_ANY);
63}
64
65static void hashmap_report_final(struct bench_res res[], int res_cnt)
66{
67	unsigned int nr_cpus = bpf_num_possible_cpus();
68	int i;
69
70	for (i = 0; i < nr_cpus; i++) {
71		u64 time = ctx.skel->bss->percpu_time[i];
72
73		if (!time)
74			continue;
75
76		printf("%d:hash_map_full_perf %lld events per sec\n",
77		       i, ctx.skel->bss->nr_loops * 1000000000ll / time);
78	}
79}
80
81const struct bench bench_bpf_hashmap_full_update = {
82	.name = "bpf-hashmap-full-update",
83	.validate = validate,
84	.setup = setup,
85	.producer_thread = producer,
86	.measure = measure,
87	.report_progress = NULL,
88	.report_final = hashmap_report_final,
89};
90