perf bench uprobe: Add uretprobe variant of uprobe benchmarks
authorIan Rogers <irogers@google.com>
Sat, 6 Apr 2024 04:09:11 +0000 (21:09 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 12 Apr 2024 20:54:02 +0000 (17:54 -0300)
Name benchmarks with _ret at the end to avoid creating a new set of
benchmarks.

Signed-off-by: Ian Rogers <irogers@google.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andrei Vagin <avagin@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Kees Kook <keescook@chromium.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20240406040911.1603801-2-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/bench/bench.h
tools/perf/bench/uprobe.c
tools/perf/builtin-bench.c
tools/perf/util/bpf_skel/bench_uprobe.bpf.c

index faa18e6d24671df02d033171c89f70dce1f05651..9f736423af53c31b30d2e52d8ae967b831a118bc 100644 (file)
@@ -46,6 +46,8 @@ int bench_breakpoint_enable(int argc, const char **argv);
 int bench_uprobe_baseline(int argc, const char **argv);
 int bench_uprobe_empty(int argc, const char **argv);
 int bench_uprobe_trace_printk(int argc, const char **argv);
+int bench_uprobe_empty_ret(int argc, const char **argv);
+int bench_uprobe_trace_printk_ret(int argc, const char **argv);
 int bench_pmu_scan(int argc, const char **argv);
 
 #define BENCH_FORMAT_DEFAULT_STR       "default"
index b722ff88fe7dea4662df4fafccdf4a80649f225e..0b90275862e19fb529232bb58d1690f4c973d09b 100644 (file)
 static int loops = LOOPS_DEFAULT;
 
 enum bench_uprobe {
-        BENCH_UPROBE__BASELINE,
-        BENCH_UPROBE__EMPTY,
-        BENCH_UPROBE__TRACE_PRINTK,
+       BENCH_UPROBE__BASELINE,
+       BENCH_UPROBE__EMPTY,
+       BENCH_UPROBE__TRACE_PRINTK,
+       BENCH_UPROBE__EMPTY_RET,
+       BENCH_UPROBE__TRACE_PRINTK_RET,
 };
 
 static const struct option options[] = {
@@ -81,6 +83,8 @@ static int bench_uprobe__setup_bpf_skel(enum bench_uprobe bench)
        case BENCH_UPROBE__BASELINE:                                                    break;
        case BENCH_UPROBE__EMPTY:        bench_uprobe__attach_uprobe(empty);            break;
        case BENCH_UPROBE__TRACE_PRINTK: bench_uprobe__attach_uprobe(trace_printk);     break;
+       case BENCH_UPROBE__EMPTY_RET:    bench_uprobe__attach_uprobe(empty_ret);        break;
+       case BENCH_UPROBE__TRACE_PRINTK_RET: bench_uprobe__attach_uprobe(trace_printk_ret); break;
        default:
                fprintf(stderr, "Invalid bench: %d\n", bench);
                goto cleanup;
@@ -197,3 +201,13 @@ int bench_uprobe_trace_printk(int argc, const char **argv)
 {
        return bench_uprobe(argc, argv, BENCH_UPROBE__TRACE_PRINTK);
 }
+
+int bench_uprobe_empty_ret(int argc, const char **argv)
+{
+       return bench_uprobe(argc, argv, BENCH_UPROBE__EMPTY_RET);
+}
+
+int bench_uprobe_trace_printk_ret(int argc, const char **argv)
+{
+       return bench_uprobe(argc, argv, BENCH_UPROBE__TRACE_PRINTK_RET);
+}
index 1a8898d5b560f37e3b7a73e7d99428bc37ed8284..2c1a9f3d847a2132eb1336a6d804c4e09889d249 100644 (file)
@@ -109,6 +109,8 @@ static struct bench uprobe_benchmarks[] = {
        { "baseline",   "Baseline libc usleep(1000) call",                              bench_uprobe_baseline,  },
        { "empty",      "Attach empty BPF prog to uprobe on usleep, system wide",       bench_uprobe_empty,     },
        { "trace_printk", "Attach trace_printk BPF prog to uprobe on usleep syswide",   bench_uprobe_trace_printk,      },
+       { "empty_ret",  "Attach empty BPF prog to uretprobe on usleep, system wide",    bench_uprobe_empty_ret, },
+       { "trace_printk_ret", "Attach trace_printk BPF prog to uretprobe on usleep syswide", bench_uprobe_trace_printk_ret,},
        { NULL, NULL, NULL },
 };
 
index 2c55896bb33c31169ca9d668ade29c0f4802370b..a01c7f791fcde4a7cee14f7a4ce0bdca473b2cf0 100644 (file)
@@ -4,6 +4,7 @@
 #include <bpf/bpf_tracing.h>
 
 unsigned int nr_uprobes;
+unsigned int nr_uretprobes;
 
 SEC("uprobe")
 int BPF_UPROBE(empty)
@@ -20,4 +21,19 @@ int BPF_UPROBE(trace_printk)
        return 0;
 }
 
+SEC("uretprobe")
+int BPF_URETPROBE(empty_ret)
+{
+       return 0;
+}
+
+SEC("uretprobe")
+int BPF_URETPROBE(trace_printk_ret)
+{
+       char fmt[] = "perf bench uretprobe %u";
+
+       bpf_trace_printk(fmt, sizeof(fmt), ++nr_uretprobes);
+       return 0;
+}
+
 char LICENSE[] SEC("license") = "Dual BSD/GPL";