Skip to content

Commit

Permalink
selftests/bpf: test passing iterator to a kfunc
Browse files Browse the repository at this point in the history
Define BPF iterator "getter" kfunc, which accepts iterator pointer as
one of the arguments. Make sure that argument passed doesn't have to be
the very first argument (unlike new-next-destroy combo).

Signed-off-by: Andrii Nakryiko <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Alexei Starovoitov <[email protected]>
  • Loading branch information
anakryiko authored and Alexei Starovoitov committed Aug 21, 2024
1 parent baebe9a commit b0cd726
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 4 deletions.
16 changes: 12 additions & 4 deletions tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,13 +141,12 @@ bpf_testmod_test_mod_kfunc(int i)

__bpf_kfunc int bpf_iter_testmod_seq_new(struct bpf_iter_testmod_seq *it, s64 value, int cnt)
{
if (cnt < 0) {
it->cnt = 0;
it->cnt = cnt;

if (cnt < 0)
return -EINVAL;
}

it->value = value;
it->cnt = cnt;

return 0;
}
Expand All @@ -162,6 +161,14 @@ __bpf_kfunc s64 *bpf_iter_testmod_seq_next(struct bpf_iter_testmod_seq* it)
return &it->value;
}

__bpf_kfunc s64 bpf_iter_testmod_seq_value(int val, struct bpf_iter_testmod_seq* it__iter)
{
if (it__iter->cnt < 0)
return 0;

return val + it__iter->value;
}

__bpf_kfunc void bpf_iter_testmod_seq_destroy(struct bpf_iter_testmod_seq *it)
{
it->cnt = 0;
Expand Down Expand Up @@ -531,6 +538,7 @@ BTF_KFUNCS_START(bpf_testmod_common_kfunc_ids)
BTF_ID_FLAGS(func, bpf_iter_testmod_seq_new, KF_ITER_NEW)
BTF_ID_FLAGS(func, bpf_iter_testmod_seq_next, KF_ITER_NEXT | KF_RET_NULL)
BTF_ID_FLAGS(func, bpf_iter_testmod_seq_destroy, KF_ITER_DESTROY)
BTF_ID_FLAGS(func, bpf_iter_testmod_seq_value)
BTF_ID_FLAGS(func, bpf_kfunc_common_test)
BTF_ID_FLAGS(func, bpf_kfunc_dynptr_test)
BTF_ID_FLAGS(func, bpf_testmod_ctx_create, KF_ACQUIRE | KF_RET_NULL)
Expand Down
50 changes: 50 additions & 0 deletions tools/testing/selftests/bpf/progs/iters_testmod_seq.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ struct bpf_iter_testmod_seq {

extern int bpf_iter_testmod_seq_new(struct bpf_iter_testmod_seq *it, s64 value, int cnt) __ksym;
extern s64 *bpf_iter_testmod_seq_next(struct bpf_iter_testmod_seq *it) __ksym;
extern s64 bpf_iter_testmod_seq_value(int blah, struct bpf_iter_testmod_seq *it) __ksym;
extern void bpf_iter_testmod_seq_destroy(struct bpf_iter_testmod_seq *it) __ksym;

const volatile __s64 exp_empty = 0 + 1;
Expand Down Expand Up @@ -76,4 +77,53 @@ int testmod_seq_truncated(const void *ctx)
return 0;
}

SEC("?raw_tp")
__failure
__msg("expected an initialized iter_testmod_seq as arg #2")
int testmod_seq_getter_before_bad(const void *ctx)
{
struct bpf_iter_testmod_seq it;

return bpf_iter_testmod_seq_value(0, &it);
}

SEC("?raw_tp")
__failure
__msg("expected an initialized iter_testmod_seq as arg #2")
int testmod_seq_getter_after_bad(const void *ctx)
{
struct bpf_iter_testmod_seq it;
s64 sum = 0, *v;

bpf_iter_testmod_seq_new(&it, 100, 100);

while ((v = bpf_iter_testmod_seq_next(&it))) {
sum += *v;
}

bpf_iter_testmod_seq_destroy(&it);

return sum + bpf_iter_testmod_seq_value(0, &it);
}

SEC("?socket")
__success __retval(1000000)
int testmod_seq_getter_good(const void *ctx)
{
struct bpf_iter_testmod_seq it;
s64 sum = 0, *v;

bpf_iter_testmod_seq_new(&it, 100, 100);

while ((v = bpf_iter_testmod_seq_next(&it))) {
sum += *v;
}

sum *= bpf_iter_testmod_seq_value(0, &it);

bpf_iter_testmod_seq_destroy(&it);

return sum;
}

char _license[] SEC("license") = "GPL";

0 comments on commit b0cd726

Please sign in to comment.