bpf: Allow ringbuf memory to be used as map key
authorDave Marchevsky <davemarchevsky@fb.com>
Thu, 20 Oct 2022 16:07:18 +0000 (09:07 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 22 Oct 2022 02:22:42 +0000 (19:22 -0700)
This patch adds support for the following pattern:

  struct some_data *data = bpf_ringbuf_reserve(&ringbuf, sizeof(struct some_data, 0));
  if (!data)
    return;
  bpf_map_lookup_elem(&another_map, &data->some_field);
  bpf_ringbuf_submit(data);

Currently the verifier does not consider bpf_ringbuf_reserve's
PTR_TO_MEM | MEM_ALLOC ret type a valid key input to bpf_map_lookup_elem.
Since PTR_TO_MEM is by definition a valid region of memory, it is safe
to use it as a key for lookups.

Signed-off-by: Dave Marchevsky <davemarchevsky@fb.com>
Acked-by: Yonghong Song <yhs@fb.com>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/r/20221020160721.4030492-1-davemarchevsky@fb.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/verifier.c

index 6f6d2d5..97351ae 100644 (file)
@@ -5641,6 +5641,7 @@ static const struct bpf_reg_types map_key_value_types = {
                PTR_TO_PACKET_META,
                PTR_TO_MAP_KEY,
                PTR_TO_MAP_VALUE,
+               PTR_TO_MEM | MEM_ALLOC,
        },
 };