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