168 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright (c) 2020 Facebook */3#include <fcntl.h>4#include "bench.h"5#include "test_overhead.skel.h"6 7/* BPF triggering benchmarks */8static struct ctx {9 struct test_overhead *skel;10 struct counter hits;11 int fd;12} ctx;13 14static void validate(void)15{16 if (env.producer_cnt != 1) {17 fprintf(stderr, "benchmark doesn't support multi-producer!\n");18 exit(1);19 }20 if (env.consumer_cnt != 0) {21 fprintf(stderr, "benchmark doesn't support consumer!\n");22 exit(1);23 }24}25 26static void *producer(void *input)27{28 char buf[] = "test_overhead";29 int err;30 31 while (true) {32 err = write(ctx.fd, buf, sizeof(buf));33 if (err < 0) {34 fprintf(stderr, "write failed\n");35 exit(1);36 }37 atomic_inc(&ctx.hits.value);38 }39}40 41static void measure(struct bench_res *res)42{43 res->hits = atomic_swap(&ctx.hits.value, 0);44}45 46static void setup_ctx(void)47{48 setup_libbpf();49 50 ctx.skel = test_overhead__open_and_load();51 if (!ctx.skel) {52 fprintf(stderr, "failed to open skeleton\n");53 exit(1);54 }55 56 ctx.fd = open("/proc/self/comm", O_WRONLY|O_TRUNC);57 if (ctx.fd < 0) {58 fprintf(stderr, "failed to open /proc/self/comm: %d\n", -errno);59 exit(1);60 }61}62 63static void attach_bpf(struct bpf_program *prog)64{65 struct bpf_link *link;66 67 link = bpf_program__attach(prog);68 if (!link) {69 fprintf(stderr, "failed to attach program!\n");70 exit(1);71 }72}73 74static void setup_base(void)75{76 setup_ctx();77}78 79static void setup_kprobe(void)80{81 setup_ctx();82 attach_bpf(ctx.skel->progs.prog1);83}84 85static void setup_kretprobe(void)86{87 setup_ctx();88 attach_bpf(ctx.skel->progs.prog2);89}90 91static void setup_rawtp(void)92{93 setup_ctx();94 attach_bpf(ctx.skel->progs.prog3);95}96 97static void setup_fentry(void)98{99 setup_ctx();100 attach_bpf(ctx.skel->progs.prog4);101}102 103static void setup_fexit(void)104{105 setup_ctx();106 attach_bpf(ctx.skel->progs.prog5);107}108 109const struct bench bench_rename_base = {110 .name = "rename-base",111 .validate = validate,112 .setup = setup_base,113 .producer_thread = producer,114 .measure = measure,115 .report_progress = hits_drops_report_progress,116 .report_final = hits_drops_report_final,117};118 119const struct bench bench_rename_kprobe = {120 .name = "rename-kprobe",121 .validate = validate,122 .setup = setup_kprobe,123 .producer_thread = producer,124 .measure = measure,125 .report_progress = hits_drops_report_progress,126 .report_final = hits_drops_report_final,127};128 129const struct bench bench_rename_kretprobe = {130 .name = "rename-kretprobe",131 .validate = validate,132 .setup = setup_kretprobe,133 .producer_thread = producer,134 .measure = measure,135 .report_progress = hits_drops_report_progress,136 .report_final = hits_drops_report_final,137};138 139const struct bench bench_rename_rawtp = {140 .name = "rename-rawtp",141 .validate = validate,142 .setup = setup_rawtp,143 .producer_thread = producer,144 .measure = measure,145 .report_progress = hits_drops_report_progress,146 .report_final = hits_drops_report_final,147};148 149const struct bench bench_rename_fentry = {150 .name = "rename-fentry",151 .validate = validate,152 .setup = setup_fentry,153 .producer_thread = producer,154 .measure = measure,155 .report_progress = hits_drops_report_progress,156 .report_final = hits_drops_report_final,157};158 159const struct bench bench_rename_fexit = {160 .name = "rename-fexit",161 .validate = validate,162 .setup = setup_fexit,163 .producer_thread = producer,164 .measure = measure,165 .report_progress = hits_drops_report_progress,166 .report_final = hits_drops_report_final,167};168