1
2
3#include "bench.h"
4#include "trigger_bench.skel.h"
5
6
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