Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/bpf: add batched tp/raw_tp/fmodret tests

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>

authored by

Andrii Nakryiko and committed by
Alexei Starovoitov
985d0681 3124591f

+81 -1
+6
tools/testing/selftests/bpf/bench.c
··· 506 506 extern const struct bench bench_trig_kretprobe_multi; 507 507 extern const struct bench bench_trig_fentry; 508 508 extern const struct bench bench_trig_fexit; 509 + extern const struct bench bench_trig_fmodret; 510 + extern const struct bench bench_trig_tp; 511 + extern const struct bench bench_trig_rawtp; 509 512 510 513 /* uprobe/uretprobe benchmarks */ 511 514 extern const struct bench bench_trig_uprobe_nop; ··· 559 556 &bench_trig_kretprobe_multi, 560 557 &bench_trig_fentry, 561 558 &bench_trig_fexit, 559 + &bench_trig_fmodret, 560 + &bench_trig_tp, 561 + &bench_trig_rawtp, 562 562 /* uprobes */ 563 563 &bench_trig_uprobe_nop, 564 564 &bench_trig_uretprobe_nop,
+39
tools/testing/selftests/bpf/benchs/bench_trigger.c
··· 233 233 attach_bpf(ctx.skel->progs.bench_trigger_fexit); 234 234 } 235 235 236 + static void trigger_fmodret_setup(void) 237 + { 238 + setup_ctx(); 239 + bpf_program__set_autoload(ctx.skel->progs.trigger_driver, false); 240 + bpf_program__set_autoload(ctx.skel->progs.trigger_driver_kfunc, true); 241 + bpf_program__set_autoload(ctx.skel->progs.bench_trigger_fmodret, true); 242 + load_ctx(); 243 + /* override driver program */ 244 + ctx.driver_prog_fd = bpf_program__fd(ctx.skel->progs.trigger_driver_kfunc); 245 + attach_bpf(ctx.skel->progs.bench_trigger_fmodret); 246 + } 247 + 248 + static void trigger_tp_setup(void) 249 + { 250 + setup_ctx(); 251 + bpf_program__set_autoload(ctx.skel->progs.trigger_driver, false); 252 + bpf_program__set_autoload(ctx.skel->progs.trigger_driver_kfunc, true); 253 + bpf_program__set_autoload(ctx.skel->progs.bench_trigger_tp, true); 254 + load_ctx(); 255 + /* override driver program */ 256 + ctx.driver_prog_fd = bpf_program__fd(ctx.skel->progs.trigger_driver_kfunc); 257 + attach_bpf(ctx.skel->progs.bench_trigger_tp); 258 + } 259 + 260 + static void trigger_rawtp_setup(void) 261 + { 262 + setup_ctx(); 263 + bpf_program__set_autoload(ctx.skel->progs.trigger_driver, false); 264 + bpf_program__set_autoload(ctx.skel->progs.trigger_driver_kfunc, true); 265 + bpf_program__set_autoload(ctx.skel->progs.bench_trigger_rawtp, true); 266 + load_ctx(); 267 + /* override driver program */ 268 + ctx.driver_prog_fd = bpf_program__fd(ctx.skel->progs.trigger_driver_kfunc); 269 + attach_bpf(ctx.skel->progs.bench_trigger_rawtp); 270 + } 271 + 236 272 /* make sure call is not inlined and not avoided by compiler, so __weak and 237 273 * inline asm volatile in the body of the function 238 274 * ··· 431 395 BENCH_TRIG_KERNEL(kretprobe_multi, "kretprobe-multi"); 432 396 BENCH_TRIG_KERNEL(fentry, "fentry"); 433 397 BENCH_TRIG_KERNEL(fexit, "fexit"); 398 + BENCH_TRIG_KERNEL(fmodret, "fmodret"); 399 + BENCH_TRIG_KERNEL(tp, "tp"); 400 + BENCH_TRIG_KERNEL(rawtp, "rawtp"); 434 401 435 402 /* uprobe benchmarks */ 436 403 #define BENCH_TRIG_USERMODE(KIND, PRODUCER, NAME) \
+2 -1
tools/testing/selftests/bpf/benchs/run_bench_trigger.sh
··· 4 4 5 5 def_tests=( \ 6 6 usermode-count kernel-count syscall-count \ 7 - fentry fexit \ 7 + fentry fexit fmodret \ 8 + rawtp tp \ 8 9 kprobe kprobe-multi \ 9 10 kretprobe kretprobe-multi \ 10 11 )
+34
tools/testing/selftests/bpf/progs/trigger_bench.c
··· 56 56 return 0; 57 57 } 58 58 59 + extern int bpf_modify_return_test_tp(int nonce) __ksym __weak; 60 + 61 + SEC("?raw_tp") 62 + int trigger_driver_kfunc(void *ctx) 63 + { 64 + int i; 65 + 66 + for (i = 0; i < batch_iters; i++) 67 + (void)bpf_modify_return_test_tp(0); /* attach point for benchmarking */ 68 + 69 + return 0; 70 + } 71 + 59 72 SEC("?kprobe/bpf_get_numa_node_id") 60 73 int bench_trigger_kprobe(void *ctx) 61 74 { ··· 106 93 107 94 SEC("?fexit/bpf_get_numa_node_id") 108 95 int bench_trigger_fexit(void *ctx) 96 + { 97 + inc_counter(); 98 + return 0; 99 + } 100 + 101 + SEC("?fmod_ret/bpf_modify_return_test_tp") 102 + int bench_trigger_fmodret(void *ctx) 103 + { 104 + inc_counter(); 105 + return -22; 106 + } 107 + 108 + SEC("?tp/bpf_test_run/bpf_trigger_tp") 109 + int bench_trigger_tp(void *ctx) 110 + { 111 + inc_counter(); 112 + return 0; 113 + } 114 + 115 + SEC("?raw_tp/bpf_trigger_tp") 116 + int bench_trigger_rawtp(void *ctx) 109 117 { 110 118 inc_counter(); 111 119 return 0;