| From a20eac0af02810669e187cb623bc904908c423af Mon Sep 17 00:00:00 2001 |
| From: Andrii Nakryiko <andrii@kernel.org> |
| Date: Mon, 1 Nov 2021 16:01:18 -0700 |
| Subject: selftests/bpf: Fix also no-alu32 strobemeta selftest |
| |
| From: Andrii Nakryiko <andrii@kernel.org> |
| |
| commit a20eac0af02810669e187cb623bc904908c423af upstream. |
| |
| Previous fix aded bpf_clamp_umax() helper use to re-validate boundaries. |
| While that works correctly, it introduces more branches, which blows up |
| past 1 million instructions in no-alu32 variant of strobemeta selftests. |
| |
| Switching len variable from u32 to u64 also fixes the issue and reduces |
| the number of validated instructions, so use that instead. Fix this |
| patch and bpf_clamp_umax() removed, both alu32 and no-alu32 selftests |
| pass. |
| |
| Fixes: 0133c20480b1 ("selftests/bpf: Fix strobemeta selftest regression") |
| Signed-off-by: Andrii Nakryiko <andrii@kernel.org> |
| Signed-off-by: Alexei Starovoitov <ast@kernel.org> |
| Link: https://lore.kernel.org/bpf/20211101230118.1273019-1-andrii@kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| tools/testing/selftests/bpf/progs/strobemeta.h | 15 ++------------- |
| 1 file changed, 2 insertions(+), 13 deletions(-) |
| |
| --- a/tools/testing/selftests/bpf/progs/strobemeta.h |
| +++ b/tools/testing/selftests/bpf/progs/strobemeta.h |
| @@ -10,14 +10,6 @@ |
| #include <linux/types.h> |
| #include "bpf_helpers.h" |
| |
| -#define bpf_clamp_umax(VAR, UMAX) \ |
| - asm volatile ( \ |
| - "if %0 <= %[max] goto +1\n" \ |
| - "%0 = %[max]\n" \ |
| - : "+r"(VAR) \ |
| - : [max]"i"(UMAX) \ |
| - ) |
| - |
| typedef uint32_t pid_t; |
| struct task_struct {}; |
| |
| @@ -357,7 +349,7 @@ static __always_inline uint64_t read_str |
| void *payload) |
| { |
| void *location; |
| - uint32_t len; |
| + uint64_t len; |
| |
| data->str_lens[idx] = 0; |
| location = calc_location(&cfg->str_locs[idx], tls_base); |
| @@ -389,7 +381,7 @@ static __always_inline void *read_map_va |
| struct strobe_map_descr* descr = &data->map_descrs[idx]; |
| struct strobe_map_raw map; |
| void *location; |
| - uint32_t len; |
| + uint64_t len; |
| int i; |
| |
| descr->tag_len = 0; /* presume no tag is set */ |
| @@ -412,7 +404,6 @@ static __always_inline void *read_map_va |
| |
| len = bpf_probe_read_str(payload, STROBE_MAX_STR_LEN, map.tag); |
| if (len <= STROBE_MAX_STR_LEN) { |
| - bpf_clamp_umax(len, STROBE_MAX_STR_LEN); |
| descr->tag_len = len; |
| payload += len; |
| } |
| @@ -430,7 +421,6 @@ static __always_inline void *read_map_va |
| len = bpf_probe_read_str(payload, STROBE_MAX_STR_LEN, |
| map.entries[i].key); |
| if (len <= STROBE_MAX_STR_LEN) { |
| - bpf_clamp_umax(len, STROBE_MAX_STR_LEN); |
| descr->key_lens[i] = len; |
| payload += len; |
| } |
| @@ -438,7 +428,6 @@ static __always_inline void *read_map_va |
| len = bpf_probe_read_str(payload, STROBE_MAX_STR_LEN, |
| map.entries[i].val); |
| if (len <= STROBE_MAX_STR_LEN) { |
| - bpf_clamp_umax(len, STROBE_MAX_STR_LEN); |
| descr->val_lens[i] = len; |
| payload += len; |
| } |