OSDN Git Service

libbpf: Add bpf_obj_get_opts()
authorJoe Burton <jevburton@google.com>
Fri, 29 Jul 2022 20:27:27 +0000 (20:27 +0000)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 29 Jul 2022 22:30:06 +0000 (15:30 -0700)
Add an extensible variant of bpf_obj_get() capable of setting the
`file_flags` parameter.

This parameter is needed to enable unprivileged access to BPF maps.
Without a method like this, users must manually make the syscall.

Signed-off-by: Joe Burton <jevburton@google.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20220729202727.3311806-1-jevburton.kernel@gmail.com
tools/lib/bpf/bpf.c
tools/lib/bpf/bpf.h
tools/lib/bpf/libbpf.map

index 5eb0df9..efcc06d 100644 (file)
@@ -579,11 +579,20 @@ int bpf_obj_pin(int fd, const char *pathname)
 
 int bpf_obj_get(const char *pathname)
 {
+       return bpf_obj_get_opts(pathname, NULL);
+}
+
+int bpf_obj_get_opts(const char *pathname, const struct bpf_obj_get_opts *opts)
+{
        union bpf_attr attr;
        int fd;
 
+       if (!OPTS_VALID(opts, bpf_obj_get_opts))
+               return libbpf_err(-EINVAL);
+
        memset(&attr, 0, sizeof(attr));
        attr.pathname = ptr_to_u64((void *)pathname);
+       attr.file_flags = OPTS_GET(opts, file_flags, 0);
 
        fd = sys_bpf_fd(BPF_OBJ_GET, &attr, sizeof(attr));
        return libbpf_err_errno(fd);
index 88a7cc4..9c50bea 100644 (file)
@@ -270,8 +270,19 @@ LIBBPF_API int bpf_map_update_batch(int fd, const void *keys, const void *values
                                    __u32 *count,
                                    const struct bpf_map_batch_opts *opts);
 
+struct bpf_obj_get_opts {
+       size_t sz; /* size of this struct for forward/backward compatibility */
+
+       __u32 file_flags;
+
+       size_t :0;
+};
+#define bpf_obj_get_opts__last_field file_flags
+
 LIBBPF_API int bpf_obj_pin(int fd, const char *pathname);
 LIBBPF_API int bpf_obj_get(const char *pathname);
+LIBBPF_API int bpf_obj_get_opts(const char *pathname,
+                               const struct bpf_obj_get_opts *opts);
 
 struct bpf_prog_attach_opts {
        size_t sz; /* size of this struct for forward/backward compatibility */
index 0625adb..119e6e1 100644 (file)
@@ -355,6 +355,7 @@ LIBBPF_0.8.0 {
 
 LIBBPF_1.0.0 {
        global:
+               bpf_obj_get_opts;
                bpf_prog_query_opts;
                bpf_program__attach_ksyscall;
                btf__add_enum64;