]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
libbpf: Split field iter code into its own file kernel
authorAlan Maguire <alan.maguire@oracle.com>
Thu, 20 Jun 2024 09:17:30 +0000 (10:17 +0100)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 21 Jun 2024 21:45:07 +0000 (14:45 -0700)
This will allow it to be shared with the kernel.  No functional change.

Suggested-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20240620091733.1967885-4-alan.maguire@oracle.com
tools/lib/bpf/Build
tools/lib/bpf/btf.c
tools/lib/bpf/btf_iter.c [new file with mode: 0644]

index 336da6844d425ec6a1b41b0445821dbd3544537f..e2cd558ca0b41859ff4cacc8218b6d7685ba1127 100644 (file)
@@ -1,4 +1,4 @@
 libbpf-y := libbpf.o bpf.o nlattr.o btf.o libbpf_errno.o str_error.o \
            netlink.o bpf_prog_linfo.o libbpf_probes.o hashmap.o \
            btf_dump.o ringbuf.o strset.o linker.o gen_loader.o relo_core.o \
-           usdt.o zip.o elf.o features.o btf_relocate.o
+           usdt.o zip.o elf.o features.o btf_iter.o btf_relocate.o
index ef1b2f573c1bc3d84004e1c56bd257ba97d18a89..0c0f60cad7693722b560d05a355dbfd627c40f79 100644 (file)
@@ -5093,168 +5093,6 @@ struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_bt
        return btf__parse_split(path, vmlinux_btf);
 }
 
-int btf_field_iter_init(struct btf_field_iter *it, struct btf_type *t, enum btf_field_iter_kind iter_kind)
-{
-       it->p = NULL;
-       it->m_idx = -1;
-       it->off_idx = 0;
-       it->vlen = 0;
-
-       switch (iter_kind) {
-       case BTF_FIELD_ITER_IDS:
-               switch (btf_kind(t)) {
-               case BTF_KIND_UNKN:
-               case BTF_KIND_INT:
-               case BTF_KIND_FLOAT:
-               case BTF_KIND_ENUM:
-               case BTF_KIND_ENUM64:
-                       it->desc = (struct btf_field_desc) {};
-                       break;
-               case BTF_KIND_FWD:
-               case BTF_KIND_CONST:
-               case BTF_KIND_VOLATILE:
-               case BTF_KIND_RESTRICT:
-               case BTF_KIND_PTR:
-               case BTF_KIND_TYPEDEF:
-               case BTF_KIND_FUNC:
-               case BTF_KIND_VAR:
-               case BTF_KIND_DECL_TAG:
-               case BTF_KIND_TYPE_TAG:
-                       it->desc = (struct btf_field_desc) { 1, {offsetof(struct btf_type, type)} };
-                       break;
-               case BTF_KIND_ARRAY:
-                       it->desc = (struct btf_field_desc) {
-                               2, {sizeof(struct btf_type) + offsetof(struct btf_array, type),
-                                   sizeof(struct btf_type) + offsetof(struct btf_array, index_type)}
-                       };
-                       break;
-               case BTF_KIND_STRUCT:
-               case BTF_KIND_UNION:
-                       it->desc = (struct btf_field_desc) {
-                               0, {},
-                               sizeof(struct btf_member),
-                               1, {offsetof(struct btf_member, type)}
-                       };
-                       break;
-               case BTF_KIND_FUNC_PROTO:
-                       it->desc = (struct btf_field_desc) {
-                               1, {offsetof(struct btf_type, type)},
-                               sizeof(struct btf_param),
-                               1, {offsetof(struct btf_param, type)}
-                       };
-                       break;
-               case BTF_KIND_DATASEC:
-                       it->desc = (struct btf_field_desc) {
-                               0, {},
-                               sizeof(struct btf_var_secinfo),
-                               1, {offsetof(struct btf_var_secinfo, type)}
-                       };
-                       break;
-               default:
-                       return -EINVAL;
-               }
-               break;
-       case BTF_FIELD_ITER_STRS:
-               switch (btf_kind(t)) {
-               case BTF_KIND_UNKN:
-                       it->desc = (struct btf_field_desc) {};
-                       break;
-               case BTF_KIND_INT:
-               case BTF_KIND_FLOAT:
-               case BTF_KIND_FWD:
-               case BTF_KIND_ARRAY:
-               case BTF_KIND_CONST:
-               case BTF_KIND_VOLATILE:
-               case BTF_KIND_RESTRICT:
-               case BTF_KIND_PTR:
-               case BTF_KIND_TYPEDEF:
-               case BTF_KIND_FUNC:
-               case BTF_KIND_VAR:
-               case BTF_KIND_DECL_TAG:
-               case BTF_KIND_TYPE_TAG:
-               case BTF_KIND_DATASEC:
-                       it->desc = (struct btf_field_desc) {
-                               1, {offsetof(struct btf_type, name_off)}
-                       };
-                       break;
-               case BTF_KIND_ENUM:
-                       it->desc = (struct btf_field_desc) {
-                               1, {offsetof(struct btf_type, name_off)},
-                               sizeof(struct btf_enum),
-                               1, {offsetof(struct btf_enum, name_off)}
-                       };
-                       break;
-               case BTF_KIND_ENUM64:
-                       it->desc = (struct btf_field_desc) {
-                               1, {offsetof(struct btf_type, name_off)},
-                               sizeof(struct btf_enum64),
-                               1, {offsetof(struct btf_enum64, name_off)}
-                       };
-                       break;
-               case BTF_KIND_STRUCT:
-               case BTF_KIND_UNION:
-                       it->desc = (struct btf_field_desc) {
-                               1, {offsetof(struct btf_type, name_off)},
-                               sizeof(struct btf_member),
-                               1, {offsetof(struct btf_member, name_off)}
-                       };
-                       break;
-               case BTF_KIND_FUNC_PROTO:
-                       it->desc = (struct btf_field_desc) {
-                               1, {offsetof(struct btf_type, name_off)},
-                               sizeof(struct btf_param),
-                               1, {offsetof(struct btf_param, name_off)}
-                       };
-                       break;
-               default:
-                       return -EINVAL;
-               }
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       if (it->desc.m_sz)
-               it->vlen = btf_vlen(t);
-
-       it->p = t;
-       return 0;
-}
-
-__u32 *btf_field_iter_next(struct btf_field_iter *it)
-{
-       if (!it->p)
-               return NULL;
-
-       if (it->m_idx < 0) {
-               if (it->off_idx < it->desc.t_off_cnt)
-                       return it->p + it->desc.t_offs[it->off_idx++];
-               /* move to per-member iteration */
-               it->m_idx = 0;
-               it->p += sizeof(struct btf_type);
-               it->off_idx = 0;
-       }
-
-       /* if type doesn't have members, stop */
-       if (it->desc.m_sz == 0) {
-               it->p = NULL;
-               return NULL;
-       }
-
-       if (it->off_idx >= it->desc.m_off_cnt) {
-               /* exhausted this member's fields, go to the next member */
-               it->m_idx++;
-               it->p += it->desc.m_sz;
-               it->off_idx = 0;
-       }
-
-       if (it->m_idx < it->vlen)
-               return it->p + it->desc.m_offs[it->off_idx++];
-
-       it->p = NULL;
-       return NULL;
-}
-
 int btf_ext_visit_type_ids(struct btf_ext *btf_ext, type_id_visit_fn visit, void *ctx)
 {
        const struct btf_ext_info *seg;
diff --git a/tools/lib/bpf/btf_iter.c b/tools/lib/bpf/btf_iter.c
new file mode 100644 (file)
index 0000000..c308aa6
--- /dev/null
@@ -0,0 +1,169 @@
+// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
+/* Copyright (c) 2021 Facebook */
+/* Copyright (c) 2024, Oracle and/or its affiliates. */
+
+#include "btf.h"
+#include "libbpf_internal.h"
+
+int btf_field_iter_init(struct btf_field_iter *it, struct btf_type *t,
+                       enum btf_field_iter_kind iter_kind)
+{
+       it->p = NULL;
+       it->m_idx = -1;
+       it->off_idx = 0;
+       it->vlen = 0;
+
+       switch (iter_kind) {
+       case BTF_FIELD_ITER_IDS:
+               switch (btf_kind(t)) {
+               case BTF_KIND_UNKN:
+               case BTF_KIND_INT:
+               case BTF_KIND_FLOAT:
+               case BTF_KIND_ENUM:
+               case BTF_KIND_ENUM64:
+                       it->desc = (struct btf_field_desc) {};
+                       break;
+               case BTF_KIND_FWD:
+               case BTF_KIND_CONST:
+               case BTF_KIND_VOLATILE:
+               case BTF_KIND_RESTRICT:
+               case BTF_KIND_PTR:
+               case BTF_KIND_TYPEDEF:
+               case BTF_KIND_FUNC:
+               case BTF_KIND_VAR:
+               case BTF_KIND_DECL_TAG:
+               case BTF_KIND_TYPE_TAG:
+                       it->desc = (struct btf_field_desc) { 1, {offsetof(struct btf_type, type)} };
+                       break;
+               case BTF_KIND_ARRAY:
+                       it->desc = (struct btf_field_desc) {
+                               2, {sizeof(struct btf_type) + offsetof(struct btf_array, type),
+                               sizeof(struct btf_type) + offsetof(struct btf_array, index_type)}
+                       };
+                       break;
+               case BTF_KIND_STRUCT:
+               case BTF_KIND_UNION:
+                       it->desc = (struct btf_field_desc) {
+                               0, {},
+                               sizeof(struct btf_member),
+                               1, {offsetof(struct btf_member, type)}
+                       };
+                       break;
+               case BTF_KIND_FUNC_PROTO:
+                       it->desc = (struct btf_field_desc) {
+                               1, {offsetof(struct btf_type, type)},
+                               sizeof(struct btf_param),
+                               1, {offsetof(struct btf_param, type)}
+                       };
+                       break;
+               case BTF_KIND_DATASEC:
+                       it->desc = (struct btf_field_desc) {
+                               0, {},
+                               sizeof(struct btf_var_secinfo),
+                               1, {offsetof(struct btf_var_secinfo, type)}
+                       };
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               break;
+       case BTF_FIELD_ITER_STRS:
+               switch (btf_kind(t)) {
+               case BTF_KIND_UNKN:
+                       it->desc = (struct btf_field_desc) {};
+                       break;
+               case BTF_KIND_INT:
+               case BTF_KIND_FLOAT:
+               case BTF_KIND_FWD:
+               case BTF_KIND_ARRAY:
+               case BTF_KIND_CONST:
+               case BTF_KIND_VOLATILE:
+               case BTF_KIND_RESTRICT:
+               case BTF_KIND_PTR:
+               case BTF_KIND_TYPEDEF:
+               case BTF_KIND_FUNC:
+               case BTF_KIND_VAR:
+               case BTF_KIND_DECL_TAG:
+               case BTF_KIND_TYPE_TAG:
+               case BTF_KIND_DATASEC:
+                       it->desc = (struct btf_field_desc) {
+                               1, {offsetof(struct btf_type, name_off)}
+                       };
+                       break;
+               case BTF_KIND_ENUM:
+                       it->desc = (struct btf_field_desc) {
+                               1, {offsetof(struct btf_type, name_off)},
+                               sizeof(struct btf_enum),
+                               1, {offsetof(struct btf_enum, name_off)}
+                       };
+                       break;
+               case BTF_KIND_ENUM64:
+                       it->desc = (struct btf_field_desc) {
+                               1, {offsetof(struct btf_type, name_off)},
+                               sizeof(struct btf_enum64),
+                               1, {offsetof(struct btf_enum64, name_off)}
+                       };
+                       break;
+               case BTF_KIND_STRUCT:
+               case BTF_KIND_UNION:
+                       it->desc = (struct btf_field_desc) {
+                               1, {offsetof(struct btf_type, name_off)},
+                               sizeof(struct btf_member),
+                               1, {offsetof(struct btf_member, name_off)}
+                       };
+                       break;
+               case BTF_KIND_FUNC_PROTO:
+                       it->desc = (struct btf_field_desc) {
+                               1, {offsetof(struct btf_type, name_off)},
+                               sizeof(struct btf_param),
+                               1, {offsetof(struct btf_param, name_off)}
+                       };
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       if (it->desc.m_sz)
+               it->vlen = btf_vlen(t);
+
+       it->p = t;
+       return 0;
+}
+
+__u32 *btf_field_iter_next(struct btf_field_iter *it)
+{
+       if (!it->p)
+               return NULL;
+
+       if (it->m_idx < 0) {
+               if (it->off_idx < it->desc.t_off_cnt)
+                       return it->p + it->desc.t_offs[it->off_idx++];
+               /* move to per-member iteration */
+               it->m_idx = 0;
+               it->p += sizeof(struct btf_type);
+               it->off_idx = 0;
+       }
+
+       /* if type doesn't have members, stop */
+       if (it->desc.m_sz == 0) {
+               it->p = NULL;
+               return NULL;
+       }
+
+       if (it->off_idx >= it->desc.m_off_cnt) {
+               /* exhausted this member's fields, go to the next member */
+               it->m_idx++;
+               it->p += it->desc.m_sz;
+               it->off_idx = 0;
+       }
+
+       if (it->m_idx < it->vlen)
+               return it->p + it->desc.m_offs[it->off_idx++];
+
+       it->p = NULL;
+       return NULL;
+}