libbpf: implement bpf_prog_query_opts
authorStanislav Fomichev <sdf@google.com>
Tue, 28 Jun 2022 17:43:12 +0000 (10:43 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 29 Jun 2022 20:21:52 +0000 (13:21 -0700)
Implement bpf_prog_query_opts as a more expendable version of
bpf_prog_query. Expose new prog_attach_flags and attach_btf_func_id as
well:

* prog_attach_flags is a per-program attach_type; relevant only for
  lsm cgroup program which might have different attach_flags
  per attach_btf_id
* attach_btf_func_id is a new field expose for prog_query which
  specifies real btf function id for lsm cgroup attachments

Acked-by: Martin KaFai Lau <kafai@fb.com>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Stanislav Fomichev <sdf@google.com>
Link: https://lore.kernel.org/r/20220628174314.1216643-10-sdf@google.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/lib/bpf/bpf.c
tools/lib/bpf/bpf.h
tools/lib/bpf/libbpf.map

index 6d848b0..5eb0df9 100644 (file)
@@ -795,24 +795,48 @@ int bpf_iter_create(int link_fd)
        return libbpf_err_errno(fd);
 }
 
-int bpf_prog_query(int target_fd, enum bpf_attach_type type, __u32 query_flags,
-                  __u32 *attach_flags, __u32 *prog_ids, __u32 *prog_cnt)
+int bpf_prog_query_opts(int target_fd,
+                       enum bpf_attach_type type,
+                       struct bpf_prog_query_opts *opts)
 {
        union bpf_attr attr;
        int ret;
 
+       if (!OPTS_VALID(opts, bpf_prog_query_opts))
+               return libbpf_err(-EINVAL);
+
        memset(&attr, 0, sizeof(attr));
+
        attr.query.target_fd    = target_fd;
        attr.query.attach_type  = type;
-       attr.query.query_flags  = query_flags;
-       attr.query.prog_cnt     = *prog_cnt;
-       attr.query.prog_ids     = ptr_to_u64(prog_ids);
+       attr.query.query_flags  = OPTS_GET(opts, query_flags, 0);
+       attr.query.prog_cnt     = OPTS_GET(opts, prog_cnt, 0);
+       attr.query.prog_ids     = ptr_to_u64(OPTS_GET(opts, prog_ids, NULL));
+       attr.query.prog_attach_flags = ptr_to_u64(OPTS_GET(opts, prog_attach_flags, NULL));
 
        ret = sys_bpf(BPF_PROG_QUERY, &attr, sizeof(attr));
 
+       OPTS_SET(opts, attach_flags, attr.query.attach_flags);
+       OPTS_SET(opts, prog_cnt, attr.query.prog_cnt);
+
+       return libbpf_err_errno(ret);
+}
+
+int bpf_prog_query(int target_fd, enum bpf_attach_type type, __u32 query_flags,
+                  __u32 *attach_flags, __u32 *prog_ids, __u32 *prog_cnt)
+{
+       LIBBPF_OPTS(bpf_prog_query_opts, opts);
+       int ret;
+
+       opts.query_flags = query_flags;
+       opts.prog_ids = prog_ids;
+       opts.prog_cnt = *prog_cnt;
+
+       ret = bpf_prog_query_opts(target_fd, type, &opts);
+
        if (attach_flags)
-               *attach_flags = attr.query.attach_flags;
-       *prog_cnt = attr.query.prog_cnt;
+               *attach_flags = opts.attach_flags;
+       *prog_cnt = opts.prog_cnt;
 
        return libbpf_err_errno(ret);
 }
index af7baf5..88a7cc4 100644 (file)
@@ -359,9 +359,24 @@ LIBBPF_API int bpf_map_get_fd_by_id(__u32 id);
 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);
+
+struct bpf_prog_query_opts {
+       size_t sz; /* size of this struct for forward/backward compatibility */
+       __u32 query_flags;
+       __u32 attach_flags; /* output argument */
+       __u32 *prog_ids;
+       __u32 prog_cnt; /* input+output argument */
+       __u32 *prog_attach_flags;
+};
+#define bpf_prog_query_opts__last_field prog_attach_flags
+
+LIBBPF_API int bpf_prog_query_opts(int target_fd,
+                                  enum bpf_attach_type type,
+                                  struct bpf_prog_query_opts *opts);
 LIBBPF_API int bpf_prog_query(int target_fd, enum bpf_attach_type type,
                              __u32 query_flags, __u32 *attach_flags,
                              __u32 *prog_ids, __u32 *prog_cnt);
+
 LIBBPF_API int bpf_raw_tracepoint_open(const char *name, int prog_fd);
 LIBBPF_API int bpf_task_fd_query(int pid, int fd, __u32 flags, char *buf,
                                 __u32 *buf_len, __u32 *prog_id, __u32 *fd_type,
index 43c6697..94b589e 100644 (file)
@@ -355,6 +355,7 @@ LIBBPF_0.8.0 {
 
 LIBBPF_1.0.0 {
        global:
+               bpf_prog_query_opts;
                btf__add_enum64;
                btf__add_enum64_value;
                libbpf_bpf_attach_type_str;