On Wed, Jan 12, 2022 at 6:27 AM Mauricio Vásquez <mauricio@xxxxxxxxxx> wrote: > > This commit extends libbpf with the features that are needed to > implement BTFGen: > > - Implement bpf_core_create_cand_cache() and bpf_core_free_cand_cache() > to handle candidates cache. > - Expose bpf_core_add_cands() and bpf_core_free_cands to handle > candidates list. > - Expose bpf_core_calc_relo_insn() to bpftool. > > Signed-off-by: Mauricio Vásquez <mauricio@xxxxxxxxxx> > Signed-off-by: Rafael David Tinoco <rafael.tinoco@xxxxxxxxxxx> > Signed-off-by: Lorenzo Fontana <lorenzo.fontana@xxxxxxxxxx> > Signed-off-by: Leonardo Di Donato <leonardo.didonato@xxxxxxxxxx> > --- > tools/lib/bpf/Makefile | 2 +- > tools/lib/bpf/libbpf.c | 43 +++++++++++++++++++++------------ > tools/lib/bpf/libbpf_internal.h | 12 +++++++++ > 3 files changed, 41 insertions(+), 16 deletions(-) > > diff --git a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile > index f947b61b2107..dba019ee2832 100644 > --- a/tools/lib/bpf/Makefile > +++ b/tools/lib/bpf/Makefile > @@ -239,7 +239,7 @@ install_lib: all_cmd > > SRC_HDRS := bpf.h libbpf.h btf.h libbpf_common.h libbpf_legacy.h xsk.h \ > bpf_helpers.h bpf_tracing.h bpf_endian.h bpf_core_read.h \ > - skel_internal.h libbpf_version.h > + skel_internal.h libbpf_version.h relo_core.h libbpf_internal.h this is the list of public API headers, this is not the right place, as Quentin pointed out > GEN_HDRS := $(BPF_GENERATED) > > INSTALL_PFX := $(DESTDIR)$(prefix)/include/bpf > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index 4959c03a46f4..344b8b8e8a50 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -5185,18 +5185,18 @@ size_t bpf_core_essential_name_len(const char *name) > return n; > } > > -static void bpf_core_free_cands(struct bpf_core_cand_list *cands) > +void bpf_core_free_cands(struct bpf_core_cand_list *cands) > { > free(cands->cands); > free(cands); > } > > -static int bpf_core_add_cands(struct bpf_core_cand *local_cand, > - size_t local_essent_len, > - const struct btf *targ_btf, > - const char *targ_btf_name, > - int targ_start_id, > - struct bpf_core_cand_list *cands) > +int bpf_core_add_cands(struct bpf_core_cand *local_cand, > + size_t local_essent_len, > + const struct btf *targ_btf, > + const char *targ_btf_name, > + int targ_start_id, > + struct bpf_core_cand_list *cands) > { > struct bpf_core_cand *new_cands, *cand; > const struct btf_type *t, *local_t; > @@ -5567,6 +5567,24 @@ static int bpf_core_resolve_relo(struct bpf_program *prog, > targ_res); > } > > +struct hashmap *bpf_core_create_cand_cache(void) > +{ > + return hashmap__new(bpf_core_hash_fn, bpf_core_equal_fn, NULL); > +} > + > +void bpf_core_free_cand_cache(struct hashmap *cand_cache) > +{ > + struct hashmap_entry *entry; > + int i; > + > + if (!IS_ERR_OR_NULL(cand_cache)) { with separate function for clean up, it's nicer to invert the if condition and exit early to reduce nesting > + hashmap__for_each_entry(cand_cache, entry, i) { > + bpf_core_free_cands(entry->value); > + } > + hashmap__free(cand_cache); > + } > +} > + [...]