90 lines · c
1// SPDX-License-Identifier: GPL-2.02/* 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 1000014 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