Re: [PATCH bpf-next v3 2/3] libbpf: Implement changes needed for BTFGen in bpftool
From: Mauricio Vásquez Bernal <hidden>
Date: 2022-01-12 14:27:11
Also in:
bpf
quoted
@@ -5498,12 +5498,13 @@ static int record_relo_core(struct bpf_program *prog, return 0; } -static int bpf_core_calc_relo_res(struct bpf_program *prog, - const struct bpf_core_relo *relo, - int relo_idx, - const struct btf *local_btf, - struct hashmap *cand_cache, - struct bpf_core_relo_res *targ_res) +int bpf_core_calc_relo_res(struct bpf_program *prog, + const struct bpf_core_relo *relo, + int relo_idx, + const struct btf *local_btf, + struct hashmap *cand_cache, + struct bpf_core_relo_res *targ_res, + struct bpf_core_spec *targ_spec)maybe let's add targ_spec and local_spec into bpf_core_relo_res? that way bpf_core_relo_res contains all the relevant information around CO-RE relo resolution?
It's not needed anymore now that we're using bpf_core_calc_relo_insn() directly in bpftool.
quoted
@@ -8190,6 +8211,11 @@ struct btf *bpf_object__btf(const struct bpf_object *obj) return obj ? obj->btf : NULL; } +struct btf_ext *bpf_object__btf_ext(const struct bpf_object *obj) +{ + return obj ? obj->btf_ext : NULL;just return obj->btf_ext, no one should be passing NULL for those getters
I dropped this function as we don't need it now.
quoted
+} + int bpf_object__btf_fd(const struct bpf_object *obj) { return obj->btf ? btf__fd(obj->btf) : -1;@@ -8281,6 +8307,20 @@ bpf_object__next_program(const struct bpf_object *obj, struct bpf_program *prev) return prog; } +size_t bpf_object__get_nr_programs(const struct bpf_object *obj) +{ + return obj->nr_programs; +} + +struct bpf_program * +bpf_object__get_program(const struct bpf_object *obj, unsigned int i) +{ + if (i >= obj->nr_programs) + return NULL; + + return &obj->programs[i]; +} + struct bpf_program * bpf_program__prev(struct bpf_program *next, const struct bpf_object *obj) {@@ -8360,6 +8400,11 @@ int bpf_program__set_autoload(struct bpf_program *prog, bool autoload) return 0; } +int bpf_program__sec_idx(const struct bpf_program *prog) +{ + return prog->sec_idx; +} + static int bpf_program_nth_fd(const struct bpf_program *prog, int n); int bpf_program__fd(const struct bpf_program *prog)@@ -11779,3 +11824,8 @@ void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s) free(s->progs); free(s); } + +void bpf_object_set_vmlinux_override(struct bpf_object *obj, struct btf *btf) +{ + obj->btf_vmlinux_override = btf; +}I don't think we need this, see comments in next patchquoted
diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 42b2f36fd9f0..2b048ee5a9b2 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h@@ -225,6 +225,8 @@ LIBBPF_API int bpf_object__set_kversion(struct bpf_object *obj, __u32 kern_versi struct btf; LIBBPF_API struct btf *bpf_object__btf(const struct bpf_object *obj); +struct btf_ext; +LIBBPF_API struct btf_ext *bpf_object__btf_ext(const struct bpf_object *obj); LIBBPF_API int bpf_object__btf_fd(const struct bpf_object *obj); LIBBPF_DEPRECATED_SINCE(0, 7, "use bpf_object__find_program_by_name() instead")@@ -290,6 +292,7 @@ LIBBPF_API LIBBPF_DEPRECATED("BPF program title is confusing term; please use bp const char *bpf_program__title(const struct bpf_program *prog, bool needs_copy); LIBBPF_API bool bpf_program__autoload(const struct bpf_program *prog); LIBBPF_API int bpf_program__set_autoload(struct bpf_program *prog, bool autoload); +LIBBPF_API int bpf_program__sec_idx(const struct bpf_program *prog); /* returns program size in bytes */ LIBBPF_DEPRECATED_SINCE(0, 7, "use bpf_program__insn_cnt() instead")diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map index b3938b3f8fc9..15da4075e0b5 100644 --- a/tools/lib/bpf/libbpf.map +++ b/tools/lib/bpf/libbpf.map@@ -392,6 +392,7 @@ LIBBPF_0.6.0 { bpf_map__map_extra; bpf_map__set_map_extra; bpf_map_create; + bpf_object__btf_ext; bpf_object__next_map; bpf_object__next_program; bpf_object__prev_map;@@ -401,6 +402,7 @@ LIBBPF_0.6.0 { bpf_program__flags; bpf_program__insn_cnt; bpf_program__insns; + bpf_program__sec_idx; bpf_program__set_flags; btf__add_btf; btf__add_decl_tag;diff --git a/tools/lib/bpf/libbpf_internal.h b/tools/lib/bpf/libbpf_internal.h index 5dbe4f463880..b1962adb110c 100644 --- a/tools/lib/bpf/libbpf_internal.h +++ b/tools/lib/bpf/libbpf_internal.h@@ -524,4 +524,26 @@ static inline int ensure_good_fd(int fd) return fd; } +struct hashmap; + +int bpf_core_calc_relo_res(struct bpf_program *prog, + const struct bpf_core_relo *relo, + int relo_idx, + const struct btf *local_btf, + struct hashmap *cand_cache, + struct bpf_core_relo_res *targ_res, + struct bpf_core_spec *targ_spec); +void bpf_object_set_vmlinux_override(struct bpf_object *obj, struct btf *btf); +struct hashmap *bpf_core_create_cand_cache(void); +void bpf_core_free_cand_cache(struct hashmap *cand_cache); + +struct bpf_program *find_prog_by_sec_insn(const struct bpf_object *obj, + size_t sec_idx, size_t insn_idx); + +size_t bpf_object__get_nr_programs(const struct bpf_object *obj); + +struct bpf_program * +bpf_object__get_program(const struct bpf_object *obj, unsigned int n); +that's too much, I don't think you need bpf_program and all the things around it (sec_idx, look up, etc). As for core_relo_is_field_based and co, bpftool can do those simple checks on their own, no need to make all the "internal API", don't overdo it with "let's expose internals of libbpf to bpftool".quoted
+ #endif /* __LIBBPF_LIBBPF_INTERNAL_H */diff --git a/tools/lib/bpf/relo_core.c b/tools/lib/bpf/relo_core.c index 4f3552468624..66dfb7fa89a2 100644 --- a/tools/lib/bpf/relo_core.c +++ b/tools/lib/bpf/relo_core.c@@ -102,7 +102,7 @@ static const char *core_relo_kind_str(enum bpf_core_relo_kind kind) } } -static bool core_relo_is_field_based(enum bpf_core_relo_kind kind) +bool core_relo_is_field_based(enum bpf_core_relo_kind kind) { switch (kind) { case BPF_CORE_FIELD_BYTE_OFFSET:@@ -117,7 +117,7 @@ static bool core_relo_is_field_based(enum bpf_core_relo_kind kind) } } -static bool core_relo_is_type_based(enum bpf_core_relo_kind kind) +bool core_relo_is_type_based(enum bpf_core_relo_kind kind) { switch (kind) { case BPF_CORE_TYPE_ID_LOCAL:@@ -130,7 +130,7 @@ static bool core_relo_is_type_based(enum bpf_core_relo_kind kind) } } -static bool core_relo_is_enumval_based(enum bpf_core_relo_kind kind) +bool core_relo_is_enumval_based(enum bpf_core_relo_kind kind) { switch (kind) { case BPF_CORE_ENUMVAL_EXISTS:diff --git a/tools/lib/bpf/relo_core.h b/tools/lib/bpf/relo_core.h index a28bf3711ce2..e969dfb032f4 100644 --- a/tools/lib/bpf/relo_core.h +++ b/tools/lib/bpf/relo_core.h@@ -84,4 +84,8 @@ int bpf_core_patch_insn(const char *prog_name, struct bpf_insn *insn, int insn_idx, const struct bpf_core_relo *relo, int relo_idx, const struct bpf_core_relo_res *res); +bool core_relo_is_field_based(enum bpf_core_relo_kind kind); +bool core_relo_is_type_based(enum bpf_core_relo_kind kind); +bool core_relo_is_enumval_based(enum bpf_core_relo_kind kind); + #endif --2.25.1