On Wed, Aug 14, 2024 at 2:39 PM Jiri Olsa <olsajiri@xxxxxxxxx> wrote: > > On Tue, Aug 13, 2024 at 04:02:55PM -0700, Andrii Nakryiko wrote: > > Factor out the logic to extract bpf_map instances from FD embedded in > > bpf_insns, adding it to the list of used_maps (unless it's already > > there, in which case we just reuse map's index). This simplifies the > > logic in resolve_pseudo_ldimm64(), especially around `struct fd` > > handling, as all that is now neatly contained in the helper and doesn't > > leak into a dozen error handling paths. > > > > Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > > --- > > kernel/bpf/verifier.c | 115 ++++++++++++++++++++++++------------------ > > 1 file changed, 66 insertions(+), 49 deletions(-) > > > > diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c > > index df3be12096cf..14e4ef687a59 100644 > > --- a/kernel/bpf/verifier.c > > +++ b/kernel/bpf/verifier.c > > @@ -18865,6 +18865,58 @@ static bool bpf_map_is_cgroup_storage(struct bpf_map *map) > > map->map_type == BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE); > > } > > > > +/* Add map behind fd to used maps list, if it's not already there, and return > > + * its index. Also set *reused to true if this map was already in the list of > > + * used maps. > > + * Returns <0 on error, or >= 0 index, on success. > > + */ > > +static int add_used_map_from_fd(struct bpf_verifier_env *env, int fd, bool *reused) > > +{ > > + struct fd f = fdget(fd); > > using 'CLASS(fd, f)(fd)' would remove few fdput lines below? That's done in the next patch once we change __bpf_map_get() behavior to allow usage of CLASS(fd, ...) > > jirka > > > + struct bpf_map *map; > > + int i; > > + > > + map = __bpf_map_get(f); > > + if (IS_ERR(map)) { > > + verbose(env, "fd %d is not pointing to valid bpf_map\n", fd); > > + return PTR_ERR(map); > > + } > > + [...]