| From 11d54762113470408c97de27ff425804226d27f6 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 13 Mar 2025 13:28:52 +0100 |
| Subject: selftests/bpf: Fix string read in strncmp benchmark |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Viktor Malik <vmalik@redhat.com> |
| |
| [ Upstream commit de07b182899227d5fd1ca7a1a7d495ecd453d49c ] |
| |
| The strncmp benchmark uses the bpf_strncmp helper and a hand-written |
| loop to compare two strings. The values of the strings are filled from |
| userspace. One of the strings is non-const (in .bss) while the other is |
| const (in .rodata) since that is the requirement of bpf_strncmp. |
| |
| The problem is that in the hand-written loop, Clang optimizes the reads |
| from the const string to always return 0 which breaks the benchmark. |
| |
| Use barrier_var to prevent the optimization. |
| |
| The effect can be seen on the strncmp-no-helper variant. |
| |
| Before this change: |
| |
| # ./bench strncmp-no-helper |
| Setting up benchmark 'strncmp-no-helper'... |
| Benchmark 'strncmp-no-helper' started. |
| Iter 0 (112.309us): hits 0.000M/s ( 0.000M/prod), drops 0.000M/s, total operations 0.000M/s |
| Iter 1 (-23.238us): hits 0.000M/s ( 0.000M/prod), drops 0.000M/s, total operations 0.000M/s |
| Iter 2 ( 58.994us): hits 0.000M/s ( 0.000M/prod), drops 0.000M/s, total operations 0.000M/s |
| Iter 3 (-30.466us): hits 0.000M/s ( 0.000M/prod), drops 0.000M/s, total operations 0.000M/s |
| Iter 4 ( 29.996us): hits 0.000M/s ( 0.000M/prod), drops 0.000M/s, total operations 0.000M/s |
| Iter 5 ( 16.949us): hits 0.000M/s ( 0.000M/prod), drops 0.000M/s, total operations 0.000M/s |
| Iter 6 (-60.035us): hits 0.000M/s ( 0.000M/prod), drops 0.000M/s, total operations 0.000M/s |
| Summary: hits 0.000 ± 0.000M/s ( 0.000M/prod), drops 0.000 ± 0.000M/s, total operations 0.000 ± 0.000M/s |
| |
| After this change: |
| |
| # ./bench strncmp-no-helper |
| Setting up benchmark 'strncmp-no-helper'... |
| Benchmark 'strncmp-no-helper' started. |
| Iter 0 ( 77.711us): hits 5.534M/s ( 5.534M/prod), drops 0.000M/s, total operations 5.534M/s |
| Iter 1 ( 11.215us): hits 6.006M/s ( 6.006M/prod), drops 0.000M/s, total operations 6.006M/s |
| Iter 2 (-14.253us): hits 5.931M/s ( 5.931M/prod), drops 0.000M/s, total operations 5.931M/s |
| Iter 3 ( 59.087us): hits 6.005M/s ( 6.005M/prod), drops 0.000M/s, total operations 6.005M/s |
| Iter 4 (-21.379us): hits 6.010M/s ( 6.010M/prod), drops 0.000M/s, total operations 6.010M/s |
| Iter 5 (-20.310us): hits 5.861M/s ( 5.861M/prod), drops 0.000M/s, total operations 5.861M/s |
| Iter 6 ( 53.937us): hits 6.004M/s ( 6.004M/prod), drops 0.000M/s, total operations 6.004M/s |
| Summary: hits 5.969 ± 0.061M/s ( 5.969M/prod), drops 0.000 ± 0.000M/s, total operations 5.969 ± 0.061M/s |
| |
| Fixes: 9c42652f8be3 ("selftests/bpf: Add benchmark for bpf_strncmp() helper") |
| Suggested-by: Andrii Nakryiko <andrii@kernel.org> |
| Signed-off-by: Viktor Malik <vmalik@redhat.com> |
| Signed-off-by: Andrii Nakryiko <andrii@kernel.org> |
| Acked-by: Hou Tao <houtao1@huawei.com> |
| Link: https://lore.kernel.org/bpf/20250313122852.1365202-1-vmalik@redhat.com |
| Signed-off-by: Alexei Starovoitov <ast@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/testing/selftests/bpf/progs/strncmp_bench.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| diff --git a/tools/testing/selftests/bpf/progs/strncmp_bench.c b/tools/testing/selftests/bpf/progs/strncmp_bench.c |
| index 18373a7df76e6..f47bf88f8d2a7 100644 |
| --- a/tools/testing/selftests/bpf/progs/strncmp_bench.c |
| +++ b/tools/testing/selftests/bpf/progs/strncmp_bench.c |
| @@ -35,7 +35,10 @@ static __always_inline int local_strncmp(const char *s1, unsigned int sz, |
| SEC("tp/syscalls/sys_enter_getpgid") |
| int strncmp_no_helper(void *ctx) |
| { |
| - if (local_strncmp(str, cmp_str_len + 1, target) < 0) |
| + const char *target_str = target; |
| + |
| + barrier_var(target_str); |
| + if (local_strncmp(str, cmp_str_len + 1, target_str) < 0) |
| __sync_add_and_fetch(&hits, 1); |
| return 0; |
| } |
| -- |
| 2.39.5 |
| |