xref: /openbmc/linux/tools/perf/bench/uprobe.c (revision 2df270716447a1024a6c955eed8fa579333dca85)
1*2df27071SArnaldo Carvalho de Melo // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2*2df27071SArnaldo Carvalho de Melo /*
3*2df27071SArnaldo Carvalho de Melo  * uprobe.c
4*2df27071SArnaldo Carvalho de Melo  *
5*2df27071SArnaldo Carvalho de Melo  * uprobe benchmarks
6*2df27071SArnaldo Carvalho de Melo  *
7*2df27071SArnaldo Carvalho de Melo  *  Copyright (C) 2023, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
8*2df27071SArnaldo Carvalho de Melo  */
9*2df27071SArnaldo Carvalho de Melo #include "../perf.h"
10*2df27071SArnaldo Carvalho de Melo #include "../util/util.h"
11*2df27071SArnaldo Carvalho de Melo #include <subcmd/parse-options.h>
12*2df27071SArnaldo Carvalho de Melo #include "../builtin.h"
13*2df27071SArnaldo Carvalho de Melo #include "bench.h"
14*2df27071SArnaldo Carvalho de Melo #include <linux/time64.h>
15*2df27071SArnaldo Carvalho de Melo 
16*2df27071SArnaldo Carvalho de Melo #include <inttypes.h>
17*2df27071SArnaldo Carvalho de Melo #include <stdio.h>
18*2df27071SArnaldo Carvalho de Melo #include <sys/time.h>
19*2df27071SArnaldo Carvalho de Melo #include <sys/types.h>
20*2df27071SArnaldo Carvalho de Melo #include <time.h>
21*2df27071SArnaldo Carvalho de Melo #include <unistd.h>
22*2df27071SArnaldo Carvalho de Melo #include <stdlib.h>
23*2df27071SArnaldo Carvalho de Melo 
24*2df27071SArnaldo Carvalho de Melo #define LOOPS_DEFAULT 1000
25*2df27071SArnaldo Carvalho de Melo static int loops = LOOPS_DEFAULT;
26*2df27071SArnaldo Carvalho de Melo 
27*2df27071SArnaldo Carvalho de Melo static const struct option options[] = {
28*2df27071SArnaldo Carvalho de Melo 	OPT_INTEGER('l', "loop",	&loops,		"Specify number of loops"),
29*2df27071SArnaldo Carvalho de Melo 	OPT_END()
30*2df27071SArnaldo Carvalho de Melo };
31*2df27071SArnaldo Carvalho de Melo 
32*2df27071SArnaldo Carvalho de Melo static const char * const bench_uprobe_usage[] = {
33*2df27071SArnaldo Carvalho de Melo 	"perf bench uprobe <options>",
34*2df27071SArnaldo Carvalho de Melo 	NULL
35*2df27071SArnaldo Carvalho de Melo };
36*2df27071SArnaldo Carvalho de Melo 
37*2df27071SArnaldo Carvalho de Melo static int bench_uprobe(int argc, const char **argv)
38*2df27071SArnaldo Carvalho de Melo {
39*2df27071SArnaldo Carvalho de Melo 	const char *name = "usleep(1000)", *unit = "usec";
40*2df27071SArnaldo Carvalho de Melo 	struct timespec start, end;
41*2df27071SArnaldo Carvalho de Melo 	u64 diff;
42*2df27071SArnaldo Carvalho de Melo 	int i;
43*2df27071SArnaldo Carvalho de Melo 
44*2df27071SArnaldo Carvalho de Melo 	argc = parse_options(argc, argv, options, bench_uprobe_usage, 0);
45*2df27071SArnaldo Carvalho de Melo 
46*2df27071SArnaldo Carvalho de Melo 	clock_gettime(CLOCK_REALTIME, &start);
47*2df27071SArnaldo Carvalho de Melo 
48*2df27071SArnaldo Carvalho de Melo 	for (i = 0; i < loops; i++) {
49*2df27071SArnaldo Carvalho de Melo 		usleep(USEC_PER_MSEC);
50*2df27071SArnaldo Carvalho de Melo 	}
51*2df27071SArnaldo Carvalho de Melo 
52*2df27071SArnaldo Carvalho de Melo 	clock_gettime(CLOCK_REALTIME, &end);
53*2df27071SArnaldo Carvalho de Melo 
54*2df27071SArnaldo Carvalho de Melo 	diff = end.tv_sec * NSEC_PER_SEC + end.tv_nsec - (start.tv_sec * NSEC_PER_SEC + start.tv_nsec);
55*2df27071SArnaldo Carvalho de Melo 	diff /= NSEC_PER_USEC;
56*2df27071SArnaldo Carvalho de Melo 
57*2df27071SArnaldo Carvalho de Melo 	switch (bench_format) {
58*2df27071SArnaldo Carvalho de Melo 	case BENCH_FORMAT_DEFAULT:
59*2df27071SArnaldo Carvalho de Melo 		printf("# Executed %'d %s calls\n", loops, name);
60*2df27071SArnaldo Carvalho de Melo 		printf(" %14s: %'" PRIu64 " %ss\n\n", "Total time", diff, unit);
61*2df27071SArnaldo Carvalho de Melo 		printf(" %'.3f %ss/op\n", (double)diff / (double)loops, unit);
62*2df27071SArnaldo Carvalho de Melo 		break;
63*2df27071SArnaldo Carvalho de Melo 
64*2df27071SArnaldo Carvalho de Melo 	case BENCH_FORMAT_SIMPLE:
65*2df27071SArnaldo Carvalho de Melo 		printf("%" PRIu64 "\n", diff);
66*2df27071SArnaldo Carvalho de Melo 		break;
67*2df27071SArnaldo Carvalho de Melo 
68*2df27071SArnaldo Carvalho de Melo 	default:
69*2df27071SArnaldo Carvalho de Melo 		/* reaching here is something of a disaster */
70*2df27071SArnaldo Carvalho de Melo 		fprintf(stderr, "Unknown format:%d\n", bench_format);
71*2df27071SArnaldo Carvalho de Melo 		exit(1);
72*2df27071SArnaldo Carvalho de Melo 	}
73*2df27071SArnaldo Carvalho de Melo 
74*2df27071SArnaldo Carvalho de Melo 	return 0;
75*2df27071SArnaldo Carvalho de Melo }
76*2df27071SArnaldo Carvalho de Melo 
77*2df27071SArnaldo Carvalho de Melo int bench_uprobe_baseline(int argc, const char **argv)
78*2df27071SArnaldo Carvalho de Melo {
79*2df27071SArnaldo Carvalho de Melo 	return bench_uprobe(argc, argv);
80*2df27071SArnaldo Carvalho de Melo }
81