summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrii Nakryiko <andrii@kernel.org>2021-11-01 16:01:18 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-11-17 11:04:52 +0100
commita3c6e358fbe42247c347c6b777167e5c4351248d (patch)
tree47cdb1ca71dcb0293189131ce51aec1e3c6784a6
parent49ed44184d0ceb0b04347ebdc050cab5ce905df7 (diff)
downloadlinux-stable-a3c6e358fbe42247c347c6b777167e5c4351248d.tar.gz
linux-stable-a3c6e358fbe42247c347c6b777167e5c4351248d.tar.bz2
linux-stable-a3c6e358fbe42247c347c6b777167e5c4351248d.zip
selftests/bpf: Fix also no-alu32 strobemeta selftest
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>
-rw-r--r--tools/testing/selftests/bpf/progs/strobemeta.h15
1 files changed, 2 insertions, 13 deletions
diff --git a/tools/testing/selftests/bpf/progs/strobemeta.h b/tools/testing/selftests/bpf/progs/strobemeta.h
index 3687ea755ab5..60c93aee2f4a 100644
--- 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/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 {};
@@ -366,7 +358,7 @@ static __always_inline uint64_t read_str_var(struct strobemeta_cfg *cfg,
void *payload)
{
void *location;
- uint32_t len;
+ uint64_t len;
data->str_lens[idx] = 0;
location = calc_location(&cfg->str_locs[idx], tls_base);
@@ -398,7 +390,7 @@ static __always_inline void *read_map_var(struct strobemeta_cfg *cfg,
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 */
@@ -421,7 +413,6 @@ static __always_inline void *read_map_var(struct strobemeta_cfg *cfg,
len = bpf_probe_read_user_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;
}
@@ -439,7 +430,6 @@ static __always_inline void *read_map_var(struct strobemeta_cfg *cfg,
len = bpf_probe_read_user_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;
}
@@ -447,7 +437,6 @@ static __always_inline void *read_map_var(struct strobemeta_cfg *cfg,
len = bpf_probe_read_user_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;
}