linux/tools/testing/selftests/bpf/benchs/bench_trigger.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/* Copyright (c) 2020 Facebook */
   3#include "bench.h"
   4#include "trigger_bench.skel.h"
   5
   6/* BPF triggering benchmarks */
   7static struct trigger_ctx {
   8        struct trigger_bench *skel;
   9} ctx;
  10
  11static struct counter base_hits;
  12
  13static void trigger_validate()
  14{
  15        if (env.consumer_cnt != 1) {
  16                fprintf(stderr, "benchmark doesn't support multi-consumer!\n");
  17                exit(1);
  18        }
  19}
  20
  21static void *trigger_base_producer(void *input)
  22{
  23        while (true) {
  24                (void)syscall(__NR_getpgid);
  25                atomic_inc(&base_hits.value);
  26        }
  27        return NULL;
  28}
  29
  30static void trigger_base_measure(struct bench_res *res)
  31{
  32        res->hits = atomic_swap(&base_hits.value, 0);
  33}
  34
  35static void *trigger_producer(void *input)
  36{
  37        while (true)
  38                (void)syscall(__NR_getpgid);
  39        return NULL;
  40}
  41
  42static void trigger_measure(struct bench_res *res)
  43{
  44        res->hits = atomic_swap(&ctx.skel->bss->hits, 0);
  45}
  46
  47static void setup_ctx()
  48{
  49        setup_libbpf();
  50
  51        ctx.skel = trigger_bench__open_and_load();
  52        if (!ctx.skel) {
  53                fprintf(stderr, "failed to open skeleton\n");
  54                exit(1);
  55        }
  56}
  57
  58static void attach_bpf(struct bpf_program *prog)
  59{
  60        struct bpf_link *link;
  61
  62        link = bpf_program__attach(prog);
  63        if (!link) {
  64                fprintf(stderr, "failed to attach program!\n");
  65                exit(1);
  66        }
  67}
  68
  69static void trigger_tp_setup()
  70{
  71        setup_ctx();
  72        attach_bpf(ctx.skel->progs.bench_trigger_tp);
  73}
  74
  75static void trigger_rawtp_setup()
  76{
  77        setup_ctx();
  78        attach_bpf(ctx.skel->progs.bench_trigger_raw_tp);
  79}
  80
  81static void trigger_kprobe_setup()
  82{
  83        setup_ctx();
  84        attach_bpf(ctx.skel->progs.bench_trigger_kprobe);
  85}
  86
  87static void trigger_fentry_setup()
  88{
  89        setup_ctx();
  90        attach_bpf(ctx.skel->progs.bench_trigger_fentry);
  91}
  92
  93static void trigger_fentry_sleep_setup()
  94{
  95        setup_ctx();
  96        attach_bpf(ctx.skel->progs.bench_trigger_fentry_sleep);
  97}
  98
  99static void trigger_fmodret_setup()
 100{
 101        setup_ctx();
 102        attach_bpf(ctx.skel->progs.bench_trigger_fmodret);
 103}
 104
 105static void *trigger_consumer(void *input)
 106{
 107        return NULL;
 108}
 109
 110const struct bench bench_trig_base = {
 111        .name = "trig-base",
 112        .validate = trigger_validate,
 113        .producer_thread = trigger_base_producer,
 114        .consumer_thread = trigger_consumer,
 115        .measure = trigger_base_measure,
 116        .report_progress = hits_drops_report_progress,
 117        .report_final = hits_drops_report_final,
 118};
 119
 120const struct bench bench_trig_tp = {
 121        .name = "trig-tp",
 122        .validate = trigger_validate,
 123        .setup = trigger_tp_setup,
 124        .producer_thread = trigger_producer,
 125        .consumer_thread = trigger_consumer,
 126        .measure = trigger_measure,
 127        .report_progress = hits_drops_report_progress,
 128        .report_final = hits_drops_report_final,
 129};
 130
 131const struct bench bench_trig_rawtp = {
 132        .name = "trig-rawtp",
 133        .validate = trigger_validate,
 134        .setup = trigger_rawtp_setup,
 135        .producer_thread = trigger_producer,
 136        .consumer_thread = trigger_consumer,
 137        .measure = trigger_measure,
 138        .report_progress = hits_drops_report_progress,
 139        .report_final = hits_drops_report_final,
 140};
 141
 142const struct bench bench_trig_kprobe = {
 143        .name = "trig-kprobe",
 144        .validate = trigger_validate,
 145        .setup = trigger_kprobe_setup,
 146        .producer_thread = trigger_producer,
 147        .consumer_thread = trigger_consumer,
 148        .measure = trigger_measure,
 149        .report_progress = hits_drops_report_progress,
 150        .report_final = hits_drops_report_final,
 151};
 152
 153const struct bench bench_trig_fentry = {
 154        .name = "trig-fentry",
 155        .validate = trigger_validate,
 156        .setup = trigger_fentry_setup,
 157        .producer_thread = trigger_producer,
 158        .consumer_thread = trigger_consumer,
 159        .measure = trigger_measure,
 160        .report_progress = hits_drops_report_progress,
 161        .report_final = hits_drops_report_final,
 162};
 163
 164const struct bench bench_trig_fentry_sleep = {
 165        .name = "trig-fentry-sleep",
 166        .validate = trigger_validate,
 167        .setup = trigger_fentry_sleep_setup,
 168        .producer_thread = trigger_producer,
 169        .consumer_thread = trigger_consumer,
 170        .measure = trigger_measure,
 171        .report_progress = hits_drops_report_progress,
 172        .report_final = hits_drops_report_final,
 173};
 174
 175const struct bench bench_trig_fmodret = {
 176        .name = "trig-fmodret",
 177        .validate = trigger_validate,
 178        .setup = trigger_fmodret_setup,
 179        .producer_thread = trigger_producer,
 180        .consumer_thread = trigger_consumer,
 181        .measure = trigger_measure,
 182        .report_progress = hits_drops_report_progress,
 183        .report_final = hits_drops_report_final,
 184};
 185