]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commit
bpf: Add basic bpf_rb_{root,node} support
authorDave Marchevsky <davemarchevsky@fb.com>
Tue, 14 Feb 2023 00:40:10 +0000 (16:40 -0800)
committerStefan Bader <stefan.bader@canonical.com>
Fri, 7 Jul 2023 10:16:57 +0000 (12:16 +0200)
commit2678f86b9dd951632ac2408c650a176260c5c293
tree7edbef9fce855f58291793ebcd91bc4d8feee1eb
parentc635e594019068e00fe00e79d3495843afb93f5b
bpf: Add basic bpf_rb_{root,node} support

BugLink: https://bugs.launchpad.net/bugs/2025067
[ Upstream commit 9c395c1b99bd23f74bc628fa000480c49593d17f ]

This patch adds special BPF_RB_{ROOT,NODE} btf_field_types similar to
BPF_LIST_{HEAD,NODE}, adds the necessary plumbing to detect the new
types, and adds bpf_rb_root_free function for freeing bpf_rb_root in
map_values.

structs bpf_rb_root and bpf_rb_node are opaque types meant to
obscure structs rb_root_cached rb_node, respectively.

btf_struct_access will prevent BPF programs from touching these special
fields automatically now that they're recognized.

btf_check_and_fixup_fields now groups list_head and rb_root together as
"graph root" fields and {list,rb}_node as "graph node", and does same
ownership cycle checking as before. Note that this function does _not_
prevent ownership type mixups (e.g. rb_root owning list_node) - that's
handled by btf_parse_graph_root.

After this patch, a bpf program can have a struct bpf_rb_root in a
map_value, but not add anything to nor do anything useful with it.

Signed-off-by: Dave Marchevsky <davemarchevsky@fb.com>
Link: https://lore.kernel.org/r/20230214004017.2534011-2-davemarchevsky@fb.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Stable-dep-of: f6a6a5a97628 ("bpf: Fix struct_meta lookup for bpf_obj_free_fields kfunc call")
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
include/linux/bpf.h
include/uapi/linux/bpf.h
kernel/bpf/btf.c
kernel/bpf/helpers.c
kernel/bpf/syscall.c
kernel/bpf/verifier.c
tools/include/uapi/linux/bpf.h
tools/testing/selftests/bpf/prog_tests/linked_list.c