]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
selftests/bpf: add batched tp/raw_tp/fmodret tests
authorAndrii Nakryiko <andrii@kernel.org>
Tue, 26 Mar 2024 16:21:51 +0000 (09:21 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 29 Mar 2024 01:31:40 +0000 (18:31 -0700)
Utilize bpf_modify_return_test_tp() kfunc to have a fast way to trigger
tp/raw_tp/fmodret programs from another BPF program, which gives us
comparable batched benchmarks to (batched) kprobe/fentry benchmarks.

We don't switch kprobe/fentry batched benchmarks to this kfunc to make
bench tool usable on older kernels as well.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/r/20240326162151.3981687-7-andrii@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/bench.c
tools/testing/selftests/bpf/benchs/bench_trigger.c
tools/testing/selftests/bpf/benchs/run_bench_trigger.sh
tools/testing/selftests/bpf/progs/trigger_bench.c

index 8b16841a3dec82bbfa64aca96266f63c9e67b357..82de56c8162e1a04723dddfe7a6dfc328324d3f2 100644 (file)
@@ -506,6 +506,9 @@ extern const struct bench bench_trig_kprobe_multi;
 extern const struct bench bench_trig_kretprobe_multi;
 extern const struct bench bench_trig_fentry;
 extern const struct bench bench_trig_fexit;
+extern const struct bench bench_trig_fmodret;
+extern const struct bench bench_trig_tp;
+extern const struct bench bench_trig_rawtp;
 
 /* uprobe/uretprobe benchmarks */
 extern const struct bench bench_trig_uprobe_nop;
@@ -556,6 +559,9 @@ static const struct bench *benchs[] = {
        &bench_trig_kretprobe_multi,
        &bench_trig_fentry,
        &bench_trig_fexit,
+       &bench_trig_fmodret,
+       &bench_trig_tp,
+       &bench_trig_rawtp,
        /* uprobes */
        &bench_trig_uprobe_nop,
        &bench_trig_uretprobe_nop,
index 2c477808a6f07b12dcf27391bc47467e6966d894..4b05539f167dffd131cb3fee1d26b06c0707bcbb 100644 (file)
@@ -233,6 +233,42 @@ static void trigger_fexit_setup(void)
        attach_bpf(ctx.skel->progs.bench_trigger_fexit);
 }
 
+static void trigger_fmodret_setup(void)
+{
+       setup_ctx();
+       bpf_program__set_autoload(ctx.skel->progs.trigger_driver, false);
+       bpf_program__set_autoload(ctx.skel->progs.trigger_driver_kfunc, true);
+       bpf_program__set_autoload(ctx.skel->progs.bench_trigger_fmodret, true);
+       load_ctx();
+       /* override driver program */
+       ctx.driver_prog_fd = bpf_program__fd(ctx.skel->progs.trigger_driver_kfunc);
+       attach_bpf(ctx.skel->progs.bench_trigger_fmodret);
+}
+
+static void trigger_tp_setup(void)
+{
+       setup_ctx();
+       bpf_program__set_autoload(ctx.skel->progs.trigger_driver, false);
+       bpf_program__set_autoload(ctx.skel->progs.trigger_driver_kfunc, true);
+       bpf_program__set_autoload(ctx.skel->progs.bench_trigger_tp, true);
+       load_ctx();
+       /* override driver program */
+       ctx.driver_prog_fd = bpf_program__fd(ctx.skel->progs.trigger_driver_kfunc);
+       attach_bpf(ctx.skel->progs.bench_trigger_tp);
+}
+
+static void trigger_rawtp_setup(void)
+{
+       setup_ctx();
+       bpf_program__set_autoload(ctx.skel->progs.trigger_driver, false);
+       bpf_program__set_autoload(ctx.skel->progs.trigger_driver_kfunc, true);
+       bpf_program__set_autoload(ctx.skel->progs.bench_trigger_rawtp, true);
+       load_ctx();
+       /* override driver program */
+       ctx.driver_prog_fd = bpf_program__fd(ctx.skel->progs.trigger_driver_kfunc);
+       attach_bpf(ctx.skel->progs.bench_trigger_rawtp);
+}
+
 /* make sure call is not inlined and not avoided by compiler, so __weak and
  * inline asm volatile in the body of the function
  *
@@ -395,6 +431,9 @@ BENCH_TRIG_KERNEL(kprobe_multi, "kprobe-multi");
 BENCH_TRIG_KERNEL(kretprobe_multi, "kretprobe-multi");
 BENCH_TRIG_KERNEL(fentry, "fentry");
 BENCH_TRIG_KERNEL(fexit, "fexit");
+BENCH_TRIG_KERNEL(fmodret, "fmodret");
+BENCH_TRIG_KERNEL(tp, "tp");
+BENCH_TRIG_KERNEL(rawtp, "rawtp");
 
 /* uprobe benchmarks */
 #define BENCH_TRIG_USERMODE(KIND, PRODUCER, NAME)                      \
index 6e790e294260af1bdeeee2182ca1d8cf24d2046a..a690f5a68b6b0275fa6669b75dae955b10fce6f2 100755 (executable)
@@ -4,7 +4,8 @@ set -eufo pipefail
 
 def_tests=( \
        usermode-count kernel-count syscall-count \
-       fentry fexit \
+       fentry fexit fmodret \
+       rawtp tp \
        kprobe kprobe-multi \
        kretprobe kretprobe-multi \
 )
index 07587cb3c9f5fe2343e7fc570cc47db0e6b0d08d..2619ed193c65a5f46e315a9048d611e36a4a38c6 100644 (file)
@@ -56,6 +56,19 @@ int trigger_driver(void *ctx)
        return 0;
 }
 
+extern int bpf_modify_return_test_tp(int nonce) __ksym __weak;
+
+SEC("?raw_tp")
+int trigger_driver_kfunc(void *ctx)
+{
+       int i;
+
+       for (i = 0; i < batch_iters; i++)
+               (void)bpf_modify_return_test_tp(0); /* attach point for benchmarking */
+
+       return 0;
+}
+
 SEC("?kprobe/bpf_get_numa_node_id")
 int bench_trigger_kprobe(void *ctx)
 {
@@ -97,3 +110,24 @@ int bench_trigger_fexit(void *ctx)
        inc_counter();
        return 0;
 }
+
+SEC("?fmod_ret/bpf_modify_return_test_tp")
+int bench_trigger_fmodret(void *ctx)
+{
+       inc_counter();
+       return -22;
+}
+
+SEC("?tp/bpf_test_run/bpf_trigger_tp")
+int bench_trigger_tp(void *ctx)
+{
+       inc_counter();
+       return 0;
+}
+
+SEC("?raw_tp/bpf_trigger_tp")
+int bench_trigger_rawtp(void *ctx)
+{
+       inc_counter();
+       return 0;
+}