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