bench_bpf_loop.c (1868B)
1// SPDX-License-Identifier: GPL-2.0 2/* Copyright (c) 2021 Facebook */ 3 4#include <argp.h> 5#include "bench.h" 6#include "bpf_loop_bench.skel.h" 7 8/* BPF triggering benchmarks */ 9static struct ctx { 10 struct bpf_loop_bench *skel; 11} ctx; 12 13static struct { 14 __u32 nr_loops; 15} args = { 16 .nr_loops = 10, 17}; 18 19enum { 20 ARG_NR_LOOPS = 4000, 21}; 22 23static const struct argp_option opts[] = { 24 { "nr_loops", ARG_NR_LOOPS, "nr_loops", 0, 25 "Set number of loops for the bpf_loop helper"}, 26 {}, 27}; 28 29static error_t parse_arg(int key, char *arg, struct argp_state *state) 30{ 31 switch (key) { 32 case ARG_NR_LOOPS: 33 args.nr_loops = strtol(arg, NULL, 10); 34 break; 35 default: 36 return ARGP_ERR_UNKNOWN; 37 } 38 39 return 0; 40} 41 42/* exported into benchmark runner */ 43const struct argp bench_bpf_loop_argp = { 44 .options = opts, 45 .parser = parse_arg, 46}; 47 48static void validate(void) 49{ 50 if (env.consumer_cnt != 1) { 51 fprintf(stderr, "benchmark doesn't support multi-consumer!\n"); 52 exit(1); 53 } 54} 55 56static void *producer(void *input) 57{ 58 while (true) 59 /* trigger the bpf program */ 60 syscall(__NR_getpgid); 61 62 return NULL; 63} 64 65static void *consumer(void *input) 66{ 67 return NULL; 68} 69 70static void measure(struct bench_res *res) 71{ 72 res->hits = atomic_swap(&ctx.skel->bss->hits, 0); 73} 74 75static void setup(void) 76{ 77 struct bpf_link *link; 78 79 setup_libbpf(); 80 81 ctx.skel = bpf_loop_bench__open_and_load(); 82 if (!ctx.skel) { 83 fprintf(stderr, "failed to open skeleton\n"); 84 exit(1); 85 } 86 87 link = bpf_program__attach(ctx.skel->progs.benchmark); 88 if (!link) { 89 fprintf(stderr, "failed to attach program!\n"); 90 exit(1); 91 } 92 93 ctx.skel->bss->nr_loops = args.nr_loops; 94} 95 96const struct bench bench_bpf_loop = { 97 .name = "bpf-loop", 98 .validate = validate, 99 .setup = setup, 100 .producer_thread = producer, 101 .consumer_thread = consumer, 102 .measure = measure, 103 .report_progress = ops_report_progress, 104 .report_final = ops_report_final, 105};