diff options
author | Andrii Nakryiko <andrii@kernel.org> | 2022-10-13 18:27:38 +0300 |
---|---|---|
committer | Andrii Nakryiko <andrii@kernel.org> | 2022-10-13 18:28:12 +0300 |
commit | e7b09357453a99e6f9e74c39e9ca1363c22c0b96 (patch) | |
tree | bc4231cfacdb6fb9493d576ea718775f325086a0 | |
parent | 0326074ff4652329f2a1a9c8685104576bd8d131 (diff) | |
parent | 6e44b9f375a3135fc4960d76a9ea6720625cad73 (diff) | |
download | linux-e7b09357453a99e6f9e74c39e9ca1363c22c0b96.tar.xz |
Merge branch 'Allow bpf_user_ringbuf_drain() callbacks to return 1'
David Vernet says:
====================
The bpf_user_ringbuf_drain() helper function allows a BPF program to
specify a callback that is invoked when draining entries from a
BPF_MAP_TYPE_USER_RINGBUF ring buffer map. The API is meant to allow the
callback to return 0 if it wants to continue draining samples, and 1 if
it's done draining. Unfortunately, bpf_user_ringbuf_drain() landed shortly
after commit 1bfe26fb0827 ("bpf: Add verifier support for custom
callback return range"), which changed the default behavior of callbacks
to only support returning 0, and the corresponding necessary change to
bpf_user_ringbuf_drain() callbacks was missed.
This patch set fixes this oversight, and updates the user_ringbuf
selftests to return 1 in a callback to catch future instances of
regression.
====================
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
-rw-r--r-- | kernel/bpf/verifier.c | 1 | ||||
-rw-r--r-- | tools/testing/selftests/bpf/progs/user_ringbuf_success.c | 4 |
2 files changed, 3 insertions, 2 deletions
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 6f6d2d511c06..9ab7188d8f68 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -6946,6 +6946,7 @@ static int set_user_ringbuf_callback_state(struct bpf_verifier_env *env, __mark_reg_not_init(env, &callee->regs[BPF_REG_5]); callee->in_callback_fn = true; + callee->callback_ret_range = tnum_range(0, 1); return 0; } diff --git a/tools/testing/selftests/bpf/progs/user_ringbuf_success.c b/tools/testing/selftests/bpf/progs/user_ringbuf_success.c index 099c23d9aa21..b39093dd5715 100644 --- a/tools/testing/selftests/bpf/progs/user_ringbuf_success.c +++ b/tools/testing/selftests/bpf/progs/user_ringbuf_success.c @@ -47,14 +47,14 @@ record_sample(struct bpf_dynptr *dynptr, void *context) if (status) { bpf_printk("bpf_dynptr_read() failed: %d\n", status); err = 1; - return 0; + return 1; } } else { sample = bpf_dynptr_data(dynptr, 0, sizeof(*sample)); if (!sample) { bpf_printk("Unexpectedly failed to get sample\n"); err = 2; - return 0; + return 1; } stack_sample = *sample; } |