Message ID | 20221004131750.2306251-5-roberto.sassu@huaweicloud.com |
---|---|
State | Superseded |
Headers | show |
Series | Add _opts variant for bpf_*_get_fd_by_id() | expand |
On Tue, Oct 4, 2022 at 6:18 AM Roberto Sassu <roberto.sassu@huaweicloud.com> wrote: > > From: Roberto Sassu <roberto.sassu@huawei.com> > > Introduce bpf_btf_get_fd_by_id_opts(), for symmetry with > bpf_map_get_fd_by_id_opts(), to let the caller pass the newly introduced > data structure bpf_get_fd_opts. Keep the existing bpf_btf_get_fd_by_id(), > and call bpf_btf_get_fd_by_id_opts() with NULL as opts argument, to prevent > setting open_flags. > > Currently, the kernel does not support non-zero open_flags for > bpf_btf_get_fd_by_id_opts(), and a call with them will result in an error > returned by the bpf() system call. The caller should always pass zero > open_flags. > > Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com> > --- > tools/lib/bpf/bpf.c | 12 +++++++++++- > tools/lib/bpf/bpf.h | 2 ++ > tools/lib/bpf/libbpf.map | 1 + > 3 files changed, 14 insertions(+), 1 deletion(-) > > diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c > index 92464c2d1da7..f43e8c8afbd3 100644 > --- a/tools/lib/bpf/bpf.c > +++ b/tools/lib/bpf/bpf.c > @@ -980,19 +980,29 @@ int bpf_map_get_fd_by_id(__u32 id) > return bpf_map_get_fd_by_id_opts(id, NULL); > } > > -int bpf_btf_get_fd_by_id(__u32 id) > +int bpf_btf_get_fd_by_id_opts(__u32 id, > + const struct bpf_get_fd_opts *opts) > { > const size_t attr_sz = offsetofend(union bpf_attr, open_flags); > union bpf_attr attr; > int fd; > > + if (!OPTS_VALID(opts, bpf_get_fd_opts)) > + return libbpf_err(-EINVAL); > + > memset(&attr, 0, attr_sz); > attr.btf_id = id; > + attr.open_flags = OPTS_GET(opts, open_flags, 0); > > fd = sys_bpf_fd(BPF_BTF_GET_FD_BY_ID, &attr, attr_sz); > return libbpf_err_errno(fd); > } > > +int bpf_btf_get_fd_by_id(__u32 id) > +{ > + return bpf_btf_get_fd_by_id_opts(id, NULL); > +} > + > int bpf_link_get_fd_by_id(__u32 id) > { > const size_t attr_sz = offsetofend(union bpf_attr, open_flags); > diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h > index 595d342fb7f9..559af0b84299 100644 > --- a/tools/lib/bpf/bpf.h > +++ b/tools/lib/bpf/bpf.h > @@ -379,6 +379,8 @@ LIBBPF_API int bpf_prog_get_fd_by_id(__u32 id); > LIBBPF_API int bpf_map_get_fd_by_id_opts(__u32 id, > const struct bpf_get_fd_opts *opts); > LIBBPF_API int bpf_map_get_fd_by_id(__u32 id); > +LIBBPF_API int bpf_btf_get_fd_by_id_opts(__u32 id, > + const struct bpf_get_fd_opts *opts); It's subjective, but opts variants of APIs, being more "advanced" usually are listed after their simpler non-opts variants. Can you please add new _opts APIs after their non-opts variants? > LIBBPF_API int bpf_btf_get_fd_by_id(__u32 id); > LIBBPF_API int bpf_link_get_fd_by_id(__u32 id); > LIBBPF_API int bpf_obj_get_info_by_fd(int bpf_fd, void *info, __u32 *info_len); > diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map > index c3604eaa220d..7011d5eec67b 100644 > --- a/tools/lib/bpf/libbpf.map > +++ b/tools/lib/bpf/libbpf.map > @@ -371,6 +371,7 @@ LIBBPF_1.0.0 { > > LIBBPF_1.1.0 { > global: > + bpf_btf_get_fd_by_id_opts; > bpf_map_get_fd_by_id_opts; > bpf_prog_get_fd_by_id_opts; > user_ring_buffer__discard; > -- > 2.25.1 >
diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index 92464c2d1da7..f43e8c8afbd3 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -980,19 +980,29 @@ int bpf_map_get_fd_by_id(__u32 id) return bpf_map_get_fd_by_id_opts(id, NULL); } -int bpf_btf_get_fd_by_id(__u32 id) +int bpf_btf_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_opts *opts) { const size_t attr_sz = offsetofend(union bpf_attr, open_flags); union bpf_attr attr; int fd; + if (!OPTS_VALID(opts, bpf_get_fd_opts)) + return libbpf_err(-EINVAL); + memset(&attr, 0, attr_sz); attr.btf_id = id; + attr.open_flags = OPTS_GET(opts, open_flags, 0); fd = sys_bpf_fd(BPF_BTF_GET_FD_BY_ID, &attr, attr_sz); return libbpf_err_errno(fd); } +int bpf_btf_get_fd_by_id(__u32 id) +{ + return bpf_btf_get_fd_by_id_opts(id, NULL); +} + int bpf_link_get_fd_by_id(__u32 id) { const size_t attr_sz = offsetofend(union bpf_attr, open_flags); diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h index 595d342fb7f9..559af0b84299 100644 --- a/tools/lib/bpf/bpf.h +++ b/tools/lib/bpf/bpf.h @@ -379,6 +379,8 @@ LIBBPF_API int bpf_prog_get_fd_by_id(__u32 id); LIBBPF_API int bpf_map_get_fd_by_id_opts(__u32 id, const struct bpf_get_fd_opts *opts); LIBBPF_API int bpf_map_get_fd_by_id(__u32 id); +LIBBPF_API int bpf_btf_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_opts *opts); LIBBPF_API int bpf_btf_get_fd_by_id(__u32 id); LIBBPF_API int bpf_link_get_fd_by_id(__u32 id); LIBBPF_API int bpf_obj_get_info_by_fd(int bpf_fd, void *info, __u32 *info_len); diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map index c3604eaa220d..7011d5eec67b 100644 --- a/tools/lib/bpf/libbpf.map +++ b/tools/lib/bpf/libbpf.map @@ -371,6 +371,7 @@ LIBBPF_1.0.0 { LIBBPF_1.1.0 { global: + bpf_btf_get_fd_by_id_opts; bpf_map_get_fd_by_id_opts; bpf_prog_get_fd_by_id_opts; user_ring_buffer__discard;