* [PATCH bpf-next] libbpf: add libbpf_load_vmlinux_btf/libbpf_load_module_btf APIs
@ 2021-07-24 5:12 Hengqi Chen
2021-07-26 22:49 ` Andrii Nakryiko
0 siblings, 1 reply; 4+ messages in thread
From: Hengqi Chen @ 2021-07-24 5:12 UTC (permalink / raw)
To: bpf; +Cc: ast, daniel, andrii, yhs, john.fastabend, hengqi.chen
Add libbpf_load_vmlinux_btf/libbpf_load_module_btf APIs.
This is part of the libbpf v1.0. [1]
[1] https://github.com/libbpf/libbpf/issues/280
Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com>
---
tools/lib/bpf/btf.c | 24 +++++++++++++++++++++++-
tools/lib/bpf/btf.h | 2 ++
tools/lib/bpf/libbpf.c | 8 ++++----
tools/lib/bpf/libbpf.map | 2 ++
4 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c
index b46760b93bb4..414e1c5635ef 100644
--- a/tools/lib/bpf/btf.c
+++ b/tools/lib/bpf/btf.c
@@ -4021,7 +4021,7 @@ static void btf_dedup_merge_hypot_map(struct btf_dedup *d)
*/
if (d->hypot_adjust_canon)
continue;
-
+
if (t_kind == BTF_KIND_FWD && c_kind != BTF_KIND_FWD)
d->map[t_id] = c_id;
@@ -4395,6 +4395,11 @@ static int btf_dedup_remap_types(struct btf_dedup *d)
* data out of it to use for target BTF.
*/
struct btf *libbpf_find_kernel_btf(void)
+{
+ return libbpf_load_vmlinux_btf();
+}
+
+struct btf *libbpf_load_vmlinux_btf(void)
{
struct {
const char *path_fmt;
@@ -4440,6 +4445,23 @@ struct btf *libbpf_find_kernel_btf(void)
return libbpf_err_ptr(-ESRCH);
}
+struct btf *libbpf_load_module_btf(const char *mod)
+{
+ char path[80];
+ struct btf *base;
+ int err;
+
+ base = libbpf_load_vmlinux_btf();
+ err = libbpf_get_error(base);
+ if (err) {
+ pr_warn("Error loading vmlinux BTF: %d\n", err);
+ return base;
+ }
+
+ snprintf(path, sizeof(path), "/sys/kernel/btf/%s", mod);
+ return btf__parse_split(path, base);
+}
+
int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx)
{
int i, n, err;
diff --git a/tools/lib/bpf/btf.h b/tools/lib/bpf/btf.h
index 374e9f15de2e..d27cc2e2f220 100644
--- a/tools/lib/bpf/btf.h
+++ b/tools/lib/bpf/btf.h
@@ -90,6 +90,8 @@ LIBBPF_API __u32 btf_ext__func_info_rec_size(const struct btf_ext *btf_ext);
LIBBPF_API __u32 btf_ext__line_info_rec_size(const struct btf_ext *btf_ext);
LIBBPF_API struct btf *libbpf_find_kernel_btf(void);
+LIBBPF_API struct btf *libbpf_load_vmlinux_btf(void);
+LIBBPF_API struct btf *libbpf_load_module_btf(const char *mod);
LIBBPF_API int btf__find_str(struct btf *btf, const char *s);
LIBBPF_API int btf__add_str(struct btf *btf, const char *s);
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index a53ca29b44ab..6e4ead454c0e 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -2685,7 +2685,7 @@ static int bpf_object__load_vmlinux_btf(struct bpf_object *obj, bool force)
if (!force && !obj_needs_vmlinux_btf(obj))
return 0;
- obj->btf_vmlinux = libbpf_find_kernel_btf();
+ obj->btf_vmlinux = libbpf_load_vmlinux_btf();
err = libbpf_get_error(obj->btf_vmlinux);
if (err) {
pr_warn("Error loading vmlinux BTF: %d\n", err);
@@ -7236,7 +7236,7 @@ static int bpf_object__collect_relos(struct bpf_object *obj)
for (i = 0; i < obj->nr_programs; i++) {
struct bpf_program *p = &obj->programs[i];
-
+
if (!p->nr_reloc)
continue;
@@ -9562,7 +9562,7 @@ int libbpf_find_vmlinux_btf_id(const char *name,
struct btf *btf;
int err;
- btf = libbpf_find_kernel_btf();
+ btf = libbpf_load_vmlinux_btf();
err = libbpf_get_error(btf);
if (err) {
pr_warn("vmlinux BTF is not found\n");
@@ -10080,7 +10080,7 @@ struct bpf_link {
int bpf_link__update_program(struct bpf_link *link, struct bpf_program *prog)
{
int ret;
-
+
ret = bpf_link_update(bpf_link__fd(link), bpf_program__fd(prog), NULL);
return libbpf_err_errno(ret);
}
diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map
index c240d488eb5e..2088bdbc0f50 100644
--- a/tools/lib/bpf/libbpf.map
+++ b/tools/lib/bpf/libbpf.map
@@ -377,4 +377,6 @@ LIBBPF_0.5.0 {
bpf_object__gen_loader;
btf_dump__dump_type_data;
libbpf_set_strict_mode;
+ libbpf_load_vmlinux_btf;
+ libbpf_load_module_btf;
} LIBBPF_0.4.0;
--
2.25.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH bpf-next] libbpf: add libbpf_load_vmlinux_btf/libbpf_load_module_btf APIs
2021-07-24 5:12 [PATCH bpf-next] libbpf: add libbpf_load_vmlinux_btf/libbpf_load_module_btf APIs Hengqi Chen
@ 2021-07-26 22:49 ` Andrii Nakryiko
2021-07-27 1:12 ` Hengqi Chen
0 siblings, 1 reply; 4+ messages in thread
From: Andrii Nakryiko @ 2021-07-26 22:49 UTC (permalink / raw)
To: Hengqi Chen
Cc: bpf, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Yonghong Song, john fastabend
On Fri, Jul 23, 2021 at 10:13 PM Hengqi Chen <hengqi.chen@gmail.com> wrote:
>
> Add libbpf_load_vmlinux_btf/libbpf_load_module_btf APIs.
> This is part of the libbpf v1.0. [1]
>
> [1] https://github.com/libbpf/libbpf/issues/280
Saying it's part of libbpf 1.0 effort and given a link to Github PR is
not really a sufficient commit message. Please expand on what you are
doing in the patch and why.
>
> Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com>
> ---
> tools/lib/bpf/btf.c | 24 +++++++++++++++++++++++-
> tools/lib/bpf/btf.h | 2 ++
> tools/lib/bpf/libbpf.c | 8 ++++----
> tools/lib/bpf/libbpf.map | 2 ++
> 4 files changed, 31 insertions(+), 5 deletions(-)
>
> diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c
> index b46760b93bb4..414e1c5635ef 100644
> --- a/tools/lib/bpf/btf.c
> +++ b/tools/lib/bpf/btf.c
> @@ -4021,7 +4021,7 @@ static void btf_dedup_merge_hypot_map(struct btf_dedup *d)
> */
> if (d->hypot_adjust_canon)
> continue;
> -
> +
> if (t_kind == BTF_KIND_FWD && c_kind != BTF_KIND_FWD)
> d->map[t_id] = c_id;
>
> @@ -4395,6 +4395,11 @@ static int btf_dedup_remap_types(struct btf_dedup *d)
> * data out of it to use for target BTF.
> */
> struct btf *libbpf_find_kernel_btf(void)
> +{
> + return libbpf_load_vmlinux_btf();
> +}
> +
> +struct btf *libbpf_load_vmlinux_btf(void)
> {
> struct {
> const char *path_fmt;
> @@ -4440,6 +4445,23 @@ struct btf *libbpf_find_kernel_btf(void)
> return libbpf_err_ptr(-ESRCH);
> }
>
> +struct btf *libbpf_load_module_btf(const char *mod)
So we probably need to allow user to pre-load and re-use vmlinux BTF
for efficiency, especially if they have some use-case to load a lot of
BTFs.
> +{
> + char path[80];
> + struct btf *base;
> + int err;
> +
> + base = libbpf_load_vmlinux_btf();
> + err = libbpf_get_error(base);
> + if (err) {
> + pr_warn("Error loading vmlinux BTF: %d\n", err);
> + return base;
libbpf_err_ptr() needs to be used here, pr_warn() could have destroyed
errno already
> + }
> +
> + snprintf(path, sizeof(path), "/sys/kernel/btf/%s", mod);
> + return btf__parse_split(path, base);
so who's freeing base BTF in this case?
> +}
> +
> int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx)
> {
> int i, n, err;
[...]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH bpf-next] libbpf: add libbpf_load_vmlinux_btf/libbpf_load_module_btf APIs
2021-07-26 22:49 ` Andrii Nakryiko
@ 2021-07-27 1:12 ` Hengqi Chen
2021-07-27 18:18 ` Andrii Nakryiko
0 siblings, 1 reply; 4+ messages in thread
From: Hengqi Chen @ 2021-07-27 1:12 UTC (permalink / raw)
To: Andrii Nakryiko
Cc: bpf, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Yonghong Song, john fastabend
On 7/27/21 6:49 AM, Andrii Nakryiko wrote:
> On Fri, Jul 23, 2021 at 10:13 PM Hengqi Chen <hengqi.chen@gmail.com> wrote:
>>
>> Add libbpf_load_vmlinux_btf/libbpf_load_module_btf APIs.
>> This is part of the libbpf v1.0. [1]
>>
>> [1] https://github.com/libbpf/libbpf/issues/280
>
> Saying it's part of libbpf 1.0 effort and given a link to Github PR is
> not really a sufficient commit message. Please expand on what you are
> doing in the patch and why.
>
Will do.
>>
>> Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com>
>> ---
>> tools/lib/bpf/btf.c | 24 +++++++++++++++++++++++-
>> tools/lib/bpf/btf.h | 2 ++
>> tools/lib/bpf/libbpf.c | 8 ++++----
>> tools/lib/bpf/libbpf.map | 2 ++
>> 4 files changed, 31 insertions(+), 5 deletions(-)
>>
>> diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c
>> index b46760b93bb4..414e1c5635ef 100644
>> --- a/tools/lib/bpf/btf.c
>> +++ b/tools/lib/bpf/btf.c
>> @@ -4021,7 +4021,7 @@ static void btf_dedup_merge_hypot_map(struct btf_dedup *d)
>> */
>> if (d->hypot_adjust_canon)
>> continue;
>> -
>> +
>> if (t_kind == BTF_KIND_FWD && c_kind != BTF_KIND_FWD)
>> d->map[t_id] = c_id;
>>
>> @@ -4395,6 +4395,11 @@ static int btf_dedup_remap_types(struct btf_dedup *d)
>> * data out of it to use for target BTF.
>> */
>> struct btf *libbpf_find_kernel_btf(void)
>> +{
>> + return libbpf_load_vmlinux_btf();
>> +}
>> +
>> +struct btf *libbpf_load_vmlinux_btf(void)
>> {
>> struct {
>> const char *path_fmt;
>> @@ -4440,6 +4445,23 @@ struct btf *libbpf_find_kernel_btf(void)
>> return libbpf_err_ptr(-ESRCH);
>> }
>>
>> +struct btf *libbpf_load_module_btf(const char *mod)
>
> So we probably need to allow user to pre-load and re-use vmlinux BTF
> for efficiency, especially if they have some use-case to load a lot of
> BTFs.
>
Should the API change to this ?
struct btf *libbpf_load_module_btf(struct btf *base, const char *mod)
It seems better for the use-case you mentioned.
>> +{
>> + char path[80];
>> + struct btf *base;
>> + int err;
>> +
>> + base = libbpf_load_vmlinux_btf();
>> + err = libbpf_get_error(base);
>> + if (err) {
>> + pr_warn("Error loading vmlinux BTF: %d\n", err);
>> + return base;
>
> libbpf_err_ptr() needs to be used here, pr_warn() could have destroyed
> errno already
>
OK.
>> + }
>> +
>> + snprintf(path, sizeof(path), "/sys/kernel/btf/%s", mod);
>> + return btf__parse_split(path, base);
>
> so who's freeing base BTF in this case?
>
Sorry, missed that.
But if we change the signature, then leave this to user.
>> +}
>> +
>> int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx)
>> {
>> int i, n, err;
>
> [...]
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH bpf-next] libbpf: add libbpf_load_vmlinux_btf/libbpf_load_module_btf APIs
2021-07-27 1:12 ` Hengqi Chen
@ 2021-07-27 18:18 ` Andrii Nakryiko
0 siblings, 0 replies; 4+ messages in thread
From: Andrii Nakryiko @ 2021-07-27 18:18 UTC (permalink / raw)
To: Hengqi Chen
Cc: bpf, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Yonghong Song, john fastabend
On Mon, Jul 26, 2021 at 6:12 PM Hengqi Chen <hengqi.chen@gmail.com> wrote:
>
>
>
> On 7/27/21 6:49 AM, Andrii Nakryiko wrote:
> > On Fri, Jul 23, 2021 at 10:13 PM Hengqi Chen <hengqi.chen@gmail.com> wrote:
> >>
> >> Add libbpf_load_vmlinux_btf/libbpf_load_module_btf APIs.
> >> This is part of the libbpf v1.0. [1]
> >>
> >> [1] https://github.com/libbpf/libbpf/issues/280
> >
> > Saying it's part of libbpf 1.0 effort and given a link to Github PR is
> > not really a sufficient commit message. Please expand on what you are
> > doing in the patch and why.
> >
>
> Will do.
>
> >>
> >> Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com>
> >> ---
> >> tools/lib/bpf/btf.c | 24 +++++++++++++++++++++++-
> >> tools/lib/bpf/btf.h | 2 ++
> >> tools/lib/bpf/libbpf.c | 8 ++++----
> >> tools/lib/bpf/libbpf.map | 2 ++
> >> 4 files changed, 31 insertions(+), 5 deletions(-)
> >>
> >> diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c
> >> index b46760b93bb4..414e1c5635ef 100644
> >> --- a/tools/lib/bpf/btf.c
> >> +++ b/tools/lib/bpf/btf.c
> >> @@ -4021,7 +4021,7 @@ static void btf_dedup_merge_hypot_map(struct btf_dedup *d)
> >> */
> >> if (d->hypot_adjust_canon)
> >> continue;
> >> -
> >> +
> >> if (t_kind == BTF_KIND_FWD && c_kind != BTF_KIND_FWD)
> >> d->map[t_id] = c_id;
> >>
> >> @@ -4395,6 +4395,11 @@ static int btf_dedup_remap_types(struct btf_dedup *d)
> >> * data out of it to use for target BTF.
> >> */
> >> struct btf *libbpf_find_kernel_btf(void)
> >> +{
> >> + return libbpf_load_vmlinux_btf();
> >> +}
> >> +
> >> +struct btf *libbpf_load_vmlinux_btf(void)
> >> {
> >> struct {
> >> const char *path_fmt;
> >> @@ -4440,6 +4445,23 @@ struct btf *libbpf_find_kernel_btf(void)
> >> return libbpf_err_ptr(-ESRCH);
> >> }
> >>
> >> +struct btf *libbpf_load_module_btf(const char *mod)
> >
> > So we probably need to allow user to pre-load and re-use vmlinux BTF
> > for efficiency, especially if they have some use-case to load a lot of
> > BTFs.
> >
>
> Should the API change to this ?
>
> struct btf *libbpf_load_module_btf(struct btf *base, const char *mod)
>
> It seems better for the use-case you mentioned.
Something like this, yeah. Let's put struct btf * as the last argument
and module name as a first one, to follow the btf__parse_split()
convention of having base_btf the last. And maybe let's call base a
"vmlinux_btf", as in this case it's pretty specific that it's supposed
to be the vmlinux BTF, not just any random BTF.
>
> >> +{
> >> + char path[80];
> >> + struct btf *base;
> >> + int err;
> >> +
> >> + base = libbpf_load_vmlinux_btf();
> >> + err = libbpf_get_error(base);
> >> + if (err) {
> >> + pr_warn("Error loading vmlinux BTF: %d\n", err);
> >> + return base;
> >
> > libbpf_err_ptr() needs to be used here, pr_warn() could have destroyed
> > errno already
> >
>
> OK.
>
> >> + }
> >> +
> >> + snprintf(path, sizeof(path), "/sys/kernel/btf/%s", mod);
> >> + return btf__parse_split(path, base);
> >
> > so who's freeing base BTF in this case?
> >
>
> Sorry, missed that.
> But if we change the signature, then leave this to user.
Right, that's what I was getting at. If we make vmlinux BTF
non-optional, then user will have to own freeing it, just like we do
that for other APIs w/ base BTF.
>
> >> +}
> >> +
> >> int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx)
> >> {
> >> int i, n, err;
> >
> > [...]
> >
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-07-27 18:18 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-24 5:12 [PATCH bpf-next] libbpf: add libbpf_load_vmlinux_btf/libbpf_load_module_btf APIs Hengqi Chen
2021-07-26 22:49 ` Andrii Nakryiko
2021-07-27 1:12 ` Hengqi Chen
2021-07-27 18:18 ` Andrii Nakryiko
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.