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