On Mon, Oct 23, 2023 at 3:00 PM Dave Marchevsky <davemarchevsky@xxxxxx> wrote: > > If a struct has a bpf_refcount field, the refcount controls lifetime of > the entire struct. Currently there's no usecase or support for multiple > bpf_refcount fields in a struct. > > bpf_spin_lock and bpf_timer fields don't support multiples either, but > with better error behavior. Parsing BTF w/ a struct containing multiple > {bpf_spin_lock, bpf_timer} fields fails in btf_get_field_type, while > multiple bpf_refcount fields doesn't fail BTF parsing at all, instead > triggering a WARN_ON_ONCE in btf_parse_fields, with the verifier using > the last bpf_refcount field to actually do refcounting. > > This patch changes bpf_refcount handling in btf_get_field_type to use > same error logic as bpf_spin_lock and bpf_timer. Since it's being used > 3x and is boilerplatey, the logic is shoved into > field_mask_test_name_check_seen helper macro. > > Signed-off-by: Dave Marchevsky <davemarchevsky@xxxxxx> > Fixes: d54730b50bae ("bpf: Introduce opaque bpf_refcount struct and add btf_record plumbing") > --- > kernel/bpf/btf.c | 37 ++++++++++++++++--------------------- > 1 file changed, 16 insertions(+), 21 deletions(-) > LGTM Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c > index 15d71d2986d3..975ef8e73393 100644 > --- a/kernel/bpf/btf.c > +++ b/kernel/bpf/btf.c > @@ -3374,8 +3374,17 @@ btf_find_graph_root(const struct btf *btf, const struct btf_type *pt, > return BTF_FIELD_FOUND; > } > [...]