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

selftests/bpf: add benchmark testing for kprobe-multi-all

For now, the benchmark for kprobe-multi is single, which means there is
only 1 function is hooked during testing. Add the testing
"kprobe-multi-all", which will hook all the kernel functions during
the benchmark. And the "kretprobe-multi-all" is added too.

Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
Link: https://lore.kernel.org/r/20250904021011.14069-4-dongml2@chinatelecom.cn
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Menglong Dong and committed by
Alexei Starovoitov
a85d8887 adf6b57c

+80 -2
+4
tools/testing/selftests/bpf/bench.c
··· 512 512 extern const struct bench bench_trig_kprobe_multi; 513 513 extern const struct bench bench_trig_kretprobe_multi; 514 514 extern const struct bench bench_trig_fentry; 515 + extern const struct bench bench_trig_kprobe_multi_all; 516 + extern const struct bench bench_trig_kretprobe_multi_all; 515 517 extern const struct bench bench_trig_fexit; 516 518 extern const struct bench bench_trig_fmodret; 517 519 extern const struct bench bench_trig_tp; ··· 589 587 &bench_trig_kprobe_multi, 590 588 &bench_trig_kretprobe_multi, 591 589 &bench_trig_fentry, 590 + &bench_trig_kprobe_multi_all, 591 + &bench_trig_kretprobe_multi_all, 592 592 &bench_trig_fexit, 593 593 &bench_trig_fmodret, 594 594 &bench_trig_tp,
+61
tools/testing/selftests/bpf/benchs/bench_trigger.c
··· 226 226 attach_bpf(ctx.skel->progs.bench_trigger_fentry); 227 227 } 228 228 229 + static void attach_ksyms_all(struct bpf_program *empty, bool kretprobe) 230 + { 231 + LIBBPF_OPTS(bpf_kprobe_multi_opts, opts); 232 + char **syms = NULL; 233 + size_t cnt = 0; 234 + 235 + /* Some recursive functions will be skipped in 236 + * bpf_get_ksyms -> skip_entry, as they can introduce sufficient 237 + * overhead. However, it's difficut to skip all the recursive 238 + * functions for a debug kernel. 239 + * 240 + * So, don't run the kprobe-multi-all and kretprobe-multi-all on 241 + * a debug kernel. 242 + */ 243 + if (bpf_get_ksyms(&syms, &cnt, true)) { 244 + fprintf(stderr, "failed to get ksyms\n"); 245 + exit(1); 246 + } 247 + 248 + opts.syms = (const char **) syms; 249 + opts.cnt = cnt; 250 + opts.retprobe = kretprobe; 251 + /* attach empty to all the kernel functions except bpf_get_numa_node_id. */ 252 + if (!bpf_program__attach_kprobe_multi_opts(empty, NULL, &opts)) { 253 + fprintf(stderr, "failed to attach bpf_program__attach_kprobe_multi_opts to all\n"); 254 + exit(1); 255 + } 256 + } 257 + 258 + static void trigger_kprobe_multi_all_setup(void) 259 + { 260 + struct bpf_program *prog, *empty; 261 + 262 + setup_ctx(); 263 + empty = ctx.skel->progs.bench_kprobe_multi_empty; 264 + prog = ctx.skel->progs.bench_trigger_kprobe_multi; 265 + bpf_program__set_autoload(empty, true); 266 + bpf_program__set_autoload(prog, true); 267 + load_ctx(); 268 + 269 + attach_ksyms_all(empty, false); 270 + attach_bpf(prog); 271 + } 272 + 273 + static void trigger_kretprobe_multi_all_setup(void) 274 + { 275 + struct bpf_program *prog, *empty; 276 + 277 + setup_ctx(); 278 + empty = ctx.skel->progs.bench_kretprobe_multi_empty; 279 + prog = ctx.skel->progs.bench_trigger_kretprobe_multi; 280 + bpf_program__set_autoload(empty, true); 281 + bpf_program__set_autoload(prog, true); 282 + load_ctx(); 283 + 284 + attach_ksyms_all(empty, true); 285 + attach_bpf(prog); 286 + } 287 + 229 288 static void trigger_fexit_setup(void) 230 289 { 231 290 setup_ctx(); ··· 571 512 BENCH_TRIG_KERNEL(kprobe_multi, "kprobe-multi"); 572 513 BENCH_TRIG_KERNEL(kretprobe_multi, "kretprobe-multi"); 573 514 BENCH_TRIG_KERNEL(fentry, "fentry"); 515 + BENCH_TRIG_KERNEL(kprobe_multi_all, "kprobe-multi-all"); 516 + BENCH_TRIG_KERNEL(kretprobe_multi_all, "kretprobe-multi-all"); 574 517 BENCH_TRIG_KERNEL(fexit, "fexit"); 575 518 BENCH_TRIG_KERNEL(fmodret, "fmodret"); 576 519 BENCH_TRIG_KERNEL(tp, "tp");
+2 -2
tools/testing/selftests/bpf/benchs/run_bench_trigger.sh
··· 6 6 usermode-count kernel-count syscall-count \ 7 7 fentry fexit fmodret \ 8 8 rawtp tp \ 9 - kprobe kprobe-multi \ 10 - kretprobe kretprobe-multi \ 9 + kprobe kprobe-multi kprobe-multi-all \ 10 + kretprobe kretprobe-multi kretprobe-multi-all \ 11 11 ) 12 12 13 13 tests=("$@")
+12
tools/testing/selftests/bpf/progs/trigger_bench.c
··· 97 97 return 0; 98 98 } 99 99 100 + SEC("?kprobe.multi/bpf_get_numa_node_id") 101 + int bench_kprobe_multi_empty(void *ctx) 102 + { 103 + return 0; 104 + } 105 + 100 106 SEC("?kretprobe.multi/bpf_get_numa_node_id") 101 107 int bench_trigger_kretprobe_multi(void *ctx) 102 108 { 103 109 inc_counter(); 110 + return 0; 111 + } 112 + 113 + SEC("?kretprobe.multi/bpf_get_numa_node_id") 114 + int bench_kretprobe_multi_empty(void *ctx) 115 + { 104 116 return 0; 105 117 } 106 118
+1
tools/testing/selftests/bpf/trace_helpers.c
··· 549 549 "preempt_count_sub", 550 550 "__rcu_read_lock", 551 551 "__rcu_read_unlock", 552 + "bpf_get_numa_node_id", 552 553 }; 553 554 554 555 static bool skip_entry(char *name)