xref: /linux/tools/testing/selftests/bpf/benchs/bench_rename.c (revision bad2e478af3b4df9fd84b4db7779ea91bd618c16)
14eaf0b5cSAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
24eaf0b5cSAndrii Nakryiko /* Copyright (c) 2020 Facebook */
34eaf0b5cSAndrii Nakryiko #include <fcntl.h>
44eaf0b5cSAndrii Nakryiko #include "bench.h"
54eaf0b5cSAndrii Nakryiko #include "test_overhead.skel.h"
64eaf0b5cSAndrii Nakryiko 
74eaf0b5cSAndrii Nakryiko /* BPF triggering benchmarks */
84eaf0b5cSAndrii Nakryiko static struct ctx {
94eaf0b5cSAndrii Nakryiko 	struct test_overhead *skel;
104eaf0b5cSAndrii Nakryiko 	struct counter hits;
114eaf0b5cSAndrii Nakryiko 	int fd;
124eaf0b5cSAndrii Nakryiko } ctx;
134eaf0b5cSAndrii Nakryiko 
144eaf0b5cSAndrii Nakryiko static void validate()
154eaf0b5cSAndrii Nakryiko {
164eaf0b5cSAndrii Nakryiko 	if (env.producer_cnt != 1) {
174eaf0b5cSAndrii Nakryiko 		fprintf(stderr, "benchmark doesn't support multi-producer!\n");
184eaf0b5cSAndrii Nakryiko 		exit(1);
194eaf0b5cSAndrii Nakryiko 	}
204eaf0b5cSAndrii Nakryiko 	if (env.consumer_cnt != 1) {
214eaf0b5cSAndrii Nakryiko 		fprintf(stderr, "benchmark doesn't support multi-consumer!\n");
224eaf0b5cSAndrii Nakryiko 		exit(1);
234eaf0b5cSAndrii Nakryiko 	}
244eaf0b5cSAndrii Nakryiko }
254eaf0b5cSAndrii Nakryiko 
264eaf0b5cSAndrii Nakryiko static void *producer(void *input)
274eaf0b5cSAndrii Nakryiko {
284eaf0b5cSAndrii Nakryiko 	char buf[] = "test_overhead";
294eaf0b5cSAndrii Nakryiko 	int err;
304eaf0b5cSAndrii Nakryiko 
314eaf0b5cSAndrii Nakryiko 	while (true) {
324eaf0b5cSAndrii Nakryiko 		err = write(ctx.fd, buf, sizeof(buf));
334eaf0b5cSAndrii Nakryiko 		if (err < 0) {
344eaf0b5cSAndrii Nakryiko 			fprintf(stderr, "write failed\n");
354eaf0b5cSAndrii Nakryiko 			exit(1);
364eaf0b5cSAndrii Nakryiko 		}
374eaf0b5cSAndrii Nakryiko 		atomic_inc(&ctx.hits.value);
384eaf0b5cSAndrii Nakryiko 	}
394eaf0b5cSAndrii Nakryiko }
404eaf0b5cSAndrii Nakryiko 
414eaf0b5cSAndrii Nakryiko static void measure(struct bench_res *res)
424eaf0b5cSAndrii Nakryiko {
434eaf0b5cSAndrii Nakryiko 	res->hits = atomic_swap(&ctx.hits.value, 0);
444eaf0b5cSAndrii Nakryiko }
454eaf0b5cSAndrii Nakryiko 
464eaf0b5cSAndrii Nakryiko static void setup_ctx()
474eaf0b5cSAndrii Nakryiko {
484eaf0b5cSAndrii Nakryiko 	setup_libbpf();
494eaf0b5cSAndrii Nakryiko 
504eaf0b5cSAndrii Nakryiko 	ctx.skel = test_overhead__open_and_load();
514eaf0b5cSAndrii Nakryiko 	if (!ctx.skel) {
524eaf0b5cSAndrii Nakryiko 		fprintf(stderr, "failed to open skeleton\n");
534eaf0b5cSAndrii Nakryiko 		exit(1);
544eaf0b5cSAndrii Nakryiko 	}
554eaf0b5cSAndrii Nakryiko 
564eaf0b5cSAndrii Nakryiko 	ctx.fd = open("/proc/self/comm", O_WRONLY|O_TRUNC);
574eaf0b5cSAndrii Nakryiko 	if (ctx.fd < 0) {
584eaf0b5cSAndrii Nakryiko 		fprintf(stderr, "failed to open /proc/self/comm: %d\n", -errno);
594eaf0b5cSAndrii Nakryiko 		exit(1);
604eaf0b5cSAndrii Nakryiko 	}
614eaf0b5cSAndrii Nakryiko }
624eaf0b5cSAndrii Nakryiko 
634eaf0b5cSAndrii Nakryiko static void attach_bpf(struct bpf_program *prog)
644eaf0b5cSAndrii Nakryiko {
654eaf0b5cSAndrii Nakryiko 	struct bpf_link *link;
664eaf0b5cSAndrii Nakryiko 
674eaf0b5cSAndrii Nakryiko 	link = bpf_program__attach(prog);
68*bad2e478SAndrii Nakryiko 	if (!link) {
694eaf0b5cSAndrii Nakryiko 		fprintf(stderr, "failed to attach program!\n");
704eaf0b5cSAndrii Nakryiko 		exit(1);
714eaf0b5cSAndrii Nakryiko 	}
724eaf0b5cSAndrii Nakryiko }
734eaf0b5cSAndrii Nakryiko 
744eaf0b5cSAndrii Nakryiko static void setup_base()
754eaf0b5cSAndrii Nakryiko {
764eaf0b5cSAndrii Nakryiko 	setup_ctx();
774eaf0b5cSAndrii Nakryiko }
784eaf0b5cSAndrii Nakryiko 
794eaf0b5cSAndrii Nakryiko static void setup_kprobe()
804eaf0b5cSAndrii Nakryiko {
814eaf0b5cSAndrii Nakryiko 	setup_ctx();
824eaf0b5cSAndrii Nakryiko 	attach_bpf(ctx.skel->progs.prog1);
834eaf0b5cSAndrii Nakryiko }
844eaf0b5cSAndrii Nakryiko 
854eaf0b5cSAndrii Nakryiko static void setup_kretprobe()
864eaf0b5cSAndrii Nakryiko {
874eaf0b5cSAndrii Nakryiko 	setup_ctx();
884eaf0b5cSAndrii Nakryiko 	attach_bpf(ctx.skel->progs.prog2);
894eaf0b5cSAndrii Nakryiko }
904eaf0b5cSAndrii Nakryiko 
914eaf0b5cSAndrii Nakryiko static void setup_rawtp()
924eaf0b5cSAndrii Nakryiko {
934eaf0b5cSAndrii Nakryiko 	setup_ctx();
944eaf0b5cSAndrii Nakryiko 	attach_bpf(ctx.skel->progs.prog3);
954eaf0b5cSAndrii Nakryiko }
964eaf0b5cSAndrii Nakryiko 
974eaf0b5cSAndrii Nakryiko static void setup_fentry()
984eaf0b5cSAndrii Nakryiko {
994eaf0b5cSAndrii Nakryiko 	setup_ctx();
1004eaf0b5cSAndrii Nakryiko 	attach_bpf(ctx.skel->progs.prog4);
1014eaf0b5cSAndrii Nakryiko }
1024eaf0b5cSAndrii Nakryiko 
1034eaf0b5cSAndrii Nakryiko static void setup_fexit()
1044eaf0b5cSAndrii Nakryiko {
1054eaf0b5cSAndrii Nakryiko 	setup_ctx();
1064eaf0b5cSAndrii Nakryiko 	attach_bpf(ctx.skel->progs.prog5);
1074eaf0b5cSAndrii Nakryiko }
1084eaf0b5cSAndrii Nakryiko 
1094eaf0b5cSAndrii Nakryiko static void *consumer(void *input)
1104eaf0b5cSAndrii Nakryiko {
1114eaf0b5cSAndrii Nakryiko 	return NULL;
1124eaf0b5cSAndrii Nakryiko }
1134eaf0b5cSAndrii Nakryiko 
1144eaf0b5cSAndrii Nakryiko const struct bench bench_rename_base = {
1154eaf0b5cSAndrii Nakryiko 	.name = "rename-base",
1164eaf0b5cSAndrii Nakryiko 	.validate = validate,
1174eaf0b5cSAndrii Nakryiko 	.setup = setup_base,
1184eaf0b5cSAndrii Nakryiko 	.producer_thread = producer,
1194eaf0b5cSAndrii Nakryiko 	.consumer_thread = consumer,
1204eaf0b5cSAndrii Nakryiko 	.measure = measure,
1214eaf0b5cSAndrii Nakryiko 	.report_progress = hits_drops_report_progress,
1224eaf0b5cSAndrii Nakryiko 	.report_final = hits_drops_report_final,
1234eaf0b5cSAndrii Nakryiko };
1244eaf0b5cSAndrii Nakryiko 
1254eaf0b5cSAndrii Nakryiko const struct bench bench_rename_kprobe = {
1264eaf0b5cSAndrii Nakryiko 	.name = "rename-kprobe",
1274eaf0b5cSAndrii Nakryiko 	.validate = validate,
1284eaf0b5cSAndrii Nakryiko 	.setup = setup_kprobe,
1294eaf0b5cSAndrii Nakryiko 	.producer_thread = producer,
1304eaf0b5cSAndrii Nakryiko 	.consumer_thread = consumer,
1314eaf0b5cSAndrii Nakryiko 	.measure = measure,
1324eaf0b5cSAndrii Nakryiko 	.report_progress = hits_drops_report_progress,
1334eaf0b5cSAndrii Nakryiko 	.report_final = hits_drops_report_final,
1344eaf0b5cSAndrii Nakryiko };
1354eaf0b5cSAndrii Nakryiko 
1364eaf0b5cSAndrii Nakryiko const struct bench bench_rename_kretprobe = {
1374eaf0b5cSAndrii Nakryiko 	.name = "rename-kretprobe",
1384eaf0b5cSAndrii Nakryiko 	.validate = validate,
1394eaf0b5cSAndrii Nakryiko 	.setup = setup_kretprobe,
1404eaf0b5cSAndrii Nakryiko 	.producer_thread = producer,
1414eaf0b5cSAndrii Nakryiko 	.consumer_thread = consumer,
1424eaf0b5cSAndrii Nakryiko 	.measure = measure,
1434eaf0b5cSAndrii Nakryiko 	.report_progress = hits_drops_report_progress,
1444eaf0b5cSAndrii Nakryiko 	.report_final = hits_drops_report_final,
1454eaf0b5cSAndrii Nakryiko };
1464eaf0b5cSAndrii Nakryiko 
1474eaf0b5cSAndrii Nakryiko const struct bench bench_rename_rawtp = {
1484eaf0b5cSAndrii Nakryiko 	.name = "rename-rawtp",
1494eaf0b5cSAndrii Nakryiko 	.validate = validate,
1504eaf0b5cSAndrii Nakryiko 	.setup = setup_rawtp,
1514eaf0b5cSAndrii Nakryiko 	.producer_thread = producer,
1524eaf0b5cSAndrii Nakryiko 	.consumer_thread = consumer,
1534eaf0b5cSAndrii Nakryiko 	.measure = measure,
1544eaf0b5cSAndrii Nakryiko 	.report_progress = hits_drops_report_progress,
1554eaf0b5cSAndrii Nakryiko 	.report_final = hits_drops_report_final,
1564eaf0b5cSAndrii Nakryiko };
1574eaf0b5cSAndrii Nakryiko 
1584eaf0b5cSAndrii Nakryiko const struct bench bench_rename_fentry = {
1594eaf0b5cSAndrii Nakryiko 	.name = "rename-fentry",
1604eaf0b5cSAndrii Nakryiko 	.validate = validate,
1614eaf0b5cSAndrii Nakryiko 	.setup = setup_fentry,
1624eaf0b5cSAndrii Nakryiko 	.producer_thread = producer,
1634eaf0b5cSAndrii Nakryiko 	.consumer_thread = consumer,
1644eaf0b5cSAndrii Nakryiko 	.measure = measure,
1654eaf0b5cSAndrii Nakryiko 	.report_progress = hits_drops_report_progress,
1664eaf0b5cSAndrii Nakryiko 	.report_final = hits_drops_report_final,
1674eaf0b5cSAndrii Nakryiko };
1684eaf0b5cSAndrii Nakryiko 
1694eaf0b5cSAndrii Nakryiko const struct bench bench_rename_fexit = {
1704eaf0b5cSAndrii Nakryiko 	.name = "rename-fexit",
1714eaf0b5cSAndrii Nakryiko 	.validate = validate,
1724eaf0b5cSAndrii Nakryiko 	.setup = setup_fexit,
1734eaf0b5cSAndrii Nakryiko 	.producer_thread = producer,
1744eaf0b5cSAndrii Nakryiko 	.consumer_thread = consumer,
1754eaf0b5cSAndrii Nakryiko 	.measure = measure,
1764eaf0b5cSAndrii Nakryiko 	.report_progress = hits_drops_report_progress,
1774eaf0b5cSAndrii Nakryiko 	.report_final = hits_drops_report_final,
1784eaf0b5cSAndrii Nakryiko };
179