Skip to content

Commit 7e3811c

Browse files
Alexei Starovoitovanakryiko
authored andcommitted
selftests/bpf: Convert profiler.c to bpf_cmp.
Convert profiler[123].c to "volatile compare" to compare barrier_var() approach vs bpf_cmp_likely() vs bpf_cmp_unlikely(). bpf_cmp_unlikely() produces correct code, but takes much longer to verify: ./veristat -C -e prog,insns,states before after_with_unlikely Program Insns (A) Insns (B) Insns (DIFF) States (A) States (B) States (DIFF) ------------------------------------ --------- --------- ------------------ ---------- ---------- ----------------- kprobe__proc_sys_write 1603 19606 +18003 (+1123.08%) 123 1678 +1555 (+1264.23%) kprobe__vfs_link 11815 70305 +58490 (+495.05%) 971 4967 +3996 (+411.53%) kprobe__vfs_symlink 5464 42896 +37432 (+685.07%) 434 3126 +2692 (+620.28%) kprobe_ret__do_filp_open 5641 44578 +38937 (+690.25%) 446 3162 +2716 (+608.97%) raw_tracepoint__sched_process_exec 2770 35962 +33192 (+1198.27%) 226 3121 +2895 (+1280.97%) raw_tracepoint__sched_process_exit 1526 2135 +609 (+39.91%) 133 208 +75 (+56.39%) raw_tracepoint__sched_process_fork 265 337 +72 (+27.17%) 19 24 +5 (+26.32%) tracepoint__syscalls__sys_enter_kill 18782 140407 +121625 (+647.56%) 1286 12176 +10890 (+846.81%) bpf_cmp_likely() is equivalent to barrier_var(): ./veristat -C -e prog,insns,states before after_with_likely Program Insns (A) Insns (B) Insns (DIFF) States (A) States (B) States (DIFF) ------------------------------------ --------- --------- -------------- ---------- ---------- ------------- kprobe__proc_sys_write 1603 1663 +60 (+3.74%) 123 127 +4 (+3.25%) kprobe__vfs_link 11815 12090 +275 (+2.33%) 971 971 +0 (+0.00%) kprobe__vfs_symlink 5464 5448 -16 (-0.29%) 434 426 -8 (-1.84%) kprobe_ret__do_filp_open 5641 5739 +98 (+1.74%) 446 446 +0 (+0.00%) raw_tracepoint__sched_process_exec 2770 2608 -162 (-5.85%) 226 216 -10 (-4.42%) raw_tracepoint__sched_process_exit 1526 1526 +0 (+0.00%) 133 133 +0 (+0.00%) raw_tracepoint__sched_process_fork 265 265 +0 (+0.00%) 19 19 +0 (+0.00%) tracepoint__syscalls__sys_enter_kill 18782 18970 +188 (+1.00%) 1286 1286 +0 (+0.00%) kprobe__proc_sys_write 2700 2809 +109 (+4.04%) 107 109 +2 (+1.87%) kprobe__vfs_link 12238 12366 +128 (+1.05%) 267 269 +2 (+0.75%) kprobe__vfs_symlink 7139 7365 +226 (+3.17%) 167 175 +8 (+4.79%) kprobe_ret__do_filp_open 7264 7070 -194 (-2.67%) 180 182 +2 (+1.11%) raw_tracepoint__sched_process_exec 3768 3453 -315 (-8.36%) 211 199 -12 (-5.69%) raw_tracepoint__sched_process_exit 3138 3138 +0 (+0.00%) 83 83 +0 (+0.00%) raw_tracepoint__sched_process_fork 265 265 +0 (+0.00%) 19 19 +0 (+0.00%) tracepoint__syscalls__sys_enter_kill 26679 24327 -2352 (-8.82%) 1067 1037 -30 (-2.81%) kprobe__proc_sys_write 1833 1833 +0 (+0.00%) 157 157 +0 (+0.00%) kprobe__vfs_link 9995 10127 +132 (+1.32%) 803 803 +0 (+0.00%) kprobe__vfs_symlink 5606 5672 +66 (+1.18%) 451 451 +0 (+0.00%) kprobe_ret__do_filp_open 5716 5782 +66 (+1.15%) 462 462 +0 (+0.00%) raw_tracepoint__sched_process_exec 3042 3042 +0 (+0.00%) 278 278 +0 (+0.00%) raw_tracepoint__sched_process_exit 1680 1680 +0 (+0.00%) 146 146 +0 (+0.00%) raw_tracepoint__sched_process_fork 299 299 +0 (+0.00%) 25 25 +0 (+0.00%) tracepoint__syscalls__sys_enter_kill 18372 18372 +0 (+0.00%) 1558 1558 +0 (+0.00%) default (mcpu=v3), no_alu32, cpuv4 have similar differences. Note one place where bpf_nop_mov() is used to workaround the verifier lack of link between the scalar register and its spill to stack. Signed-off-by: Alexei Starovoitov <[email protected]> Signed-off-by: Andrii Nakryiko <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent 0bcc62a commit 7e3811c

File tree

1 file changed

+18
-46
lines changed

1 file changed

+18
-46
lines changed

tools/testing/selftests/bpf/progs/profiler.inc.h

Lines changed: 18 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "profiler.h"
99
#include "err.h"
10+
#include "bpf_experimental.h"
1011

1112
#ifndef NULL
1213
#define NULL 0
@@ -221,8 +222,7 @@ static INLINE void* read_full_cgroup_path(struct kernfs_node* cgroup_node,
221222
return payload;
222223
if (cgroup_node == cgroup_root_node)
223224
*root_pos = payload - payload_start;
224-
if (filepart_length <= MAX_PATH) {
225-
barrier_var(filepart_length);
225+
if (bpf_cmp_likely(filepart_length, <=, MAX_PATH)) {
226226
payload += filepart_length;
227227
}
228228
cgroup_node = BPF_CORE_READ(cgroup_node, parent);
@@ -305,19 +305,15 @@ static INLINE void* populate_cgroup_info(struct cgroup_data_t* cgroup_data,
305305
size_t cgroup_root_length =
306306
bpf_probe_read_kernel_str(payload, MAX_PATH,
307307
BPF_CORE_READ(root_kernfs, name));
308-
barrier_var(cgroup_root_length);
309-
if (cgroup_root_length <= MAX_PATH) {
310-
barrier_var(cgroup_root_length);
308+
if (bpf_cmp_likely(cgroup_root_length, <=, MAX_PATH)) {
311309
cgroup_data->cgroup_root_length = cgroup_root_length;
312310
payload += cgroup_root_length;
313311
}
314312

315313
size_t cgroup_proc_length =
316314
bpf_probe_read_kernel_str(payload, MAX_PATH,
317315
BPF_CORE_READ(proc_kernfs, name));
318-
barrier_var(cgroup_proc_length);
319-
if (cgroup_proc_length <= MAX_PATH) {
320-
barrier_var(cgroup_proc_length);
316+
if (bpf_cmp_likely(cgroup_proc_length, <=, MAX_PATH)) {
321317
cgroup_data->cgroup_proc_length = cgroup_proc_length;
322318
payload += cgroup_proc_length;
323319
}
@@ -347,9 +343,7 @@ static INLINE void* populate_var_metadata(struct var_metadata_t* metadata,
347343
metadata->comm_length = 0;
348344

349345
size_t comm_length = bpf_core_read_str(payload, TASK_COMM_LEN, &task->comm);
350-
barrier_var(comm_length);
351-
if (comm_length <= TASK_COMM_LEN) {
352-
barrier_var(comm_length);
346+
if (bpf_cmp_likely(comm_length, <=, TASK_COMM_LEN)) {
353347
metadata->comm_length = comm_length;
354348
payload += comm_length;
355349
}
@@ -494,10 +488,9 @@ read_absolute_file_path_from_dentry(struct dentry* filp_dentry, void* payload)
494488
filepart_length =
495489
bpf_probe_read_kernel_str(payload, MAX_PATH,
496490
BPF_CORE_READ(filp_dentry, d_name.name));
497-
barrier_var(filepart_length);
498-
if (filepart_length > MAX_PATH)
491+
bpf_nop_mov(filepart_length);
492+
if (bpf_cmp_unlikely(filepart_length, >, MAX_PATH))
499493
break;
500-
barrier_var(filepart_length);
501494
payload += filepart_length;
502495
length += filepart_length;
503496

@@ -579,9 +572,7 @@ ssize_t BPF_KPROBE(kprobe__proc_sys_write,
579572

580573
size_t sysctl_val_length = bpf_probe_read_kernel_str(payload,
581574
CTL_MAXNAME, buf);
582-
barrier_var(sysctl_val_length);
583-
if (sysctl_val_length <= CTL_MAXNAME) {
584-
barrier_var(sysctl_val_length);
575+
if (bpf_cmp_likely(sysctl_val_length, <=, CTL_MAXNAME)) {
585576
sysctl_data->sysctl_val_length = sysctl_val_length;
586577
payload += sysctl_val_length;
587578
}
@@ -590,9 +581,7 @@ ssize_t BPF_KPROBE(kprobe__proc_sys_write,
590581
bpf_probe_read_kernel_str(payload, MAX_PATH,
591582
BPF_CORE_READ(filp, f_path.dentry,
592583
d_name.name));
593-
barrier_var(sysctl_path_length);
594-
if (sysctl_path_length <= MAX_PATH) {
595-
barrier_var(sysctl_path_length);
584+
if (bpf_cmp_likely(sysctl_path_length, <=, MAX_PATH)) {
596585
sysctl_data->sysctl_path_length = sysctl_path_length;
597586
payload += sysctl_path_length;
598587
}
@@ -658,9 +647,7 @@ int raw_tracepoint__sched_process_exit(void* ctx)
658647
kill_data->kill_target_cgroup_proc_length = 0;
659648

660649
size_t comm_length = bpf_core_read_str(payload, TASK_COMM_LEN, &task->comm);
661-
barrier_var(comm_length);
662-
if (comm_length <= TASK_COMM_LEN) {
663-
barrier_var(comm_length);
650+
if (bpf_cmp_likely(comm_length, <=, TASK_COMM_LEN)) {
664651
kill_data->kill_target_name_length = comm_length;
665652
payload += comm_length;
666653
}
@@ -669,9 +656,7 @@ int raw_tracepoint__sched_process_exit(void* ctx)
669656
bpf_probe_read_kernel_str(payload,
670657
KILL_TARGET_LEN,
671658
BPF_CORE_READ(proc_kernfs, name));
672-
barrier_var(cgroup_proc_length);
673-
if (cgroup_proc_length <= KILL_TARGET_LEN) {
674-
barrier_var(cgroup_proc_length);
659+
if (bpf_cmp_likely(cgroup_proc_length, <=, KILL_TARGET_LEN)) {
675660
kill_data->kill_target_cgroup_proc_length = cgroup_proc_length;
676661
payload += cgroup_proc_length;
677662
}
@@ -731,9 +716,7 @@ int raw_tracepoint__sched_process_exec(struct bpf_raw_tracepoint_args* ctx)
731716
const char* filename = BPF_CORE_READ(bprm, filename);
732717
size_t bin_path_length =
733718
bpf_probe_read_kernel_str(payload, MAX_FILENAME_LEN, filename);
734-
barrier_var(bin_path_length);
735-
if (bin_path_length <= MAX_FILENAME_LEN) {
736-
barrier_var(bin_path_length);
719+
if (bpf_cmp_likely(bin_path_length, <=, MAX_FILENAME_LEN)) {
737720
proc_exec_data->bin_path_length = bin_path_length;
738721
payload += bin_path_length;
739722
}
@@ -743,8 +726,7 @@ int raw_tracepoint__sched_process_exec(struct bpf_raw_tracepoint_args* ctx)
743726
unsigned int cmdline_length = probe_read_lim(payload, arg_start,
744727
arg_end - arg_start, MAX_ARGS_LEN);
745728

746-
if (cmdline_length <= MAX_ARGS_LEN) {
747-
barrier_var(cmdline_length);
729+
if (bpf_cmp_likely(cmdline_length, <=, MAX_ARGS_LEN)) {
748730
proc_exec_data->cmdline_length = cmdline_length;
749731
payload += cmdline_length;
750732
}
@@ -821,9 +803,7 @@ int kprobe_ret__do_filp_open(struct pt_regs* ctx)
821803
payload = populate_cgroup_info(&filemod_data->cgroup_data, task, payload);
822804

823805
size_t len = read_absolute_file_path_from_dentry(filp_dentry, payload);
824-
barrier_var(len);
825-
if (len <= MAX_FILEPATH_LENGTH) {
826-
barrier_var(len);
806+
if (bpf_cmp_likely(len, <=, MAX_FILEPATH_LENGTH)) {
827807
payload += len;
828808
filemod_data->dst_filepath_length = len;
829809
}
@@ -876,17 +856,13 @@ int BPF_KPROBE(kprobe__vfs_link,
876856
payload = populate_cgroup_info(&filemod_data->cgroup_data, task, payload);
877857

878858
size_t len = read_absolute_file_path_from_dentry(old_dentry, payload);
879-
barrier_var(len);
880-
if (len <= MAX_FILEPATH_LENGTH) {
881-
barrier_var(len);
859+
if (bpf_cmp_likely(len, <=, MAX_FILEPATH_LENGTH)) {
882860
payload += len;
883861
filemod_data->src_filepath_length = len;
884862
}
885863

886864
len = read_absolute_file_path_from_dentry(new_dentry, payload);
887-
barrier_var(len);
888-
if (len <= MAX_FILEPATH_LENGTH) {
889-
barrier_var(len);
865+
if (bpf_cmp_likely(len, <=, MAX_FILEPATH_LENGTH)) {
890866
payload += len;
891867
filemod_data->dst_filepath_length = len;
892868
}
@@ -936,16 +912,12 @@ int BPF_KPROBE(kprobe__vfs_symlink, struct inode* dir, struct dentry* dentry,
936912

937913
size_t len = bpf_probe_read_kernel_str(payload, MAX_FILEPATH_LENGTH,
938914
oldname);
939-
barrier_var(len);
940-
if (len <= MAX_FILEPATH_LENGTH) {
941-
barrier_var(len);
915+
if (bpf_cmp_likely(len, <=, MAX_FILEPATH_LENGTH)) {
942916
payload += len;
943917
filemod_data->src_filepath_length = len;
944918
}
945919
len = read_absolute_file_path_from_dentry(dentry, payload);
946-
barrier_var(len);
947-
if (len <= MAX_FILEPATH_LENGTH) {
948-
barrier_var(len);
920+
if (bpf_cmp_likely(len, <=, MAX_FILEPATH_LENGTH)) {
949921
payload += len;
950922
filemod_data->dst_filepath_length = len;
951923
}

0 commit comments

Comments
 (0)