libbpf: Wire through log_true_size for bpf_btf_load() API
authorAndrii Nakryiko <andrii@kernel.org>
Thu, 6 Apr 2023 23:42:02 +0000 (16:42 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 11 Apr 2023 16:05:44 +0000 (18:05 +0200)
Similar to what we did for bpf_prog_load() in previous patch, wire
returning of log_true_size value from kernel back to the user through
OPTS out field.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20230406234205.323208-17-andrii@kernel.org
tools/lib/bpf/bpf.c
tools/lib/bpf/bpf.h

index a031de0..128ac72 100644 (file)
@@ -1083,9 +1083,9 @@ int bpf_raw_tracepoint_open(const char *name, int prog_fd)
        return libbpf_err_errno(fd);
 }
 
-int bpf_btf_load(const void *btf_data, size_t btf_size, const struct bpf_btf_load_opts *opts)
+int bpf_btf_load(const void *btf_data, size_t btf_size, struct bpf_btf_load_opts *opts)
 {
-       const size_t attr_sz = offsetofend(union bpf_attr, btf_log_level);
+       const size_t attr_sz = offsetofend(union bpf_attr, btf_log_true_size);
        union bpf_attr attr;
        char *log_buf;
        size_t log_size;
@@ -1128,6 +1128,8 @@ int bpf_btf_load(const void *btf_data, size_t btf_size, const struct bpf_btf_loa
                attr.btf_log_level = 1;
                fd = sys_bpf_fd(BPF_BTF_LOAD, &attr, attr_sz);
        }
+
+       OPTS_SET(opts, log_true_size, attr.btf_log_true_size);
        return libbpf_err_errno(fd);
 }
 
index cfa0cdf..a2c0913 100644 (file)
@@ -124,11 +124,18 @@ struct bpf_btf_load_opts {
        char *log_buf;
        __u32 log_level;
        __u32 log_size;
+       /* output: actual total log contents size (including termintaing zero).
+        * It could be both larger than original log_size (if log was
+        * truncated), or smaller (if log buffer wasn't filled completely).
+        * If kernel doesn't support this feature, log_size is left unchanged.
+        */
+       __u32 log_true_size;
+       size_t :0;
 };
-#define bpf_btf_load_opts__last_field log_size
+#define bpf_btf_load_opts__last_field log_true_size
 
 LIBBPF_API int bpf_btf_load(const void *btf_data, size_t btf_size,
-                           const struct bpf_btf_load_opts *opts);
+                           struct bpf_btf_load_opts *opts);
 
 LIBBPF_API int bpf_map_update_elem(int fd, const void *key, const void *value,
                                   __u64 flags);