Skip to content

Commit

Permalink
selftests/bpf: Fix also no-alu32 strobemeta selftest
Browse files Browse the repository at this point in the history
commit a20eac0 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: 0133c20 ("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>
  • Loading branch information
anakryiko authored and gregkh committed Nov 18, 2021
1 parent 1e73409 commit 5be42b2
Showing 1 changed file with 2 additions and 13 deletions.
15 changes: 2 additions & 13 deletions tools/testing/selftests/bpf/progs/strobemeta.h
Expand Up @@ -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 {};

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 */
Expand All @@ -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;
}
Expand All @@ -439,15 +430,13 @@ 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;
}
descr->val_lens[i] = 0;
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;
}
Expand Down

0 comments on commit 5be42b2

Please sign in to comment.