Thread (21 messages) flat view 21 messages, 5 authors, 2020-11-24

Re: [PATCH bpf-next 4/6] libbpf: add kernel module BTF support for CO-RE relocations

From: Andrii Nakryiko <hidden>
Date: 2020-11-20 23:12:55
Also in: bpf

On Fri, Nov 20, 2020 at 3:06 PM Martin KaFai Lau [off-list ref] wrote:
On Thu, Nov 19, 2020 at 03:22:42PM -0800, Andrii Nakryiko wrote:
[ ... ]
quoted
+static int load_module_btfs(struct bpf_object *obj)
+{
+     struct bpf_btf_info info;
+     struct module_btf *mod_btf;
+     struct btf *btf;
+     char name[64];
+     __u32 id, len;
+     int err, fd;
+
+     if (obj->btf_modules_loaded)
+             return 0;
+
+     /* don't do this again, even if we find no module BTFs */
+     obj->btf_modules_loaded = true;
+
+     /* kernel too old to support module BTFs */
+     if (!kernel_supports(FEAT_MODULE_BTF))
+             return 0;
+
+     while (true) {
+             err = bpf_btf_get_next_id(id, &id);
+             if (err && errno == ENOENT)
+                     return 0;
+             if (err) {
+                     err = -errno;
+                     pr_warn("failed to iterate BTF objects: %d\n", err);
+                     return err;
+             }
+
+             fd = bpf_btf_get_fd_by_id(id);
+             if (fd < 0) {
+                     if (errno == ENOENT)
+                             continue; /* expected race: BTF was unloaded */
+                     err = -errno;
+                     pr_warn("failed to get BTF object #%d FD: %d\n", id, err);
+                     return err;
+             }
+
+             len = sizeof(info);
+             memset(&info, 0, sizeof(info));
+             info.name = ptr_to_u64(name);
+             info.name_len = sizeof(name);
+
+             err = bpf_obj_get_info_by_fd(fd, &info, &len);
+             if (err) {
+                     err = -errno;
+                     pr_warn("failed to get BTF object #%d info: %d\n", id, err);
                        close(fd);
quoted
+                     return err;
+             }
+
+             /* ignore non-module BTFs */
+             if (!info.kernel_btf || strcmp(name, "vmlinux") == 0) {
+                     close(fd);
+                     continue;
+             }
+
[ ... ]
quoted
@@ -8656,9 +8815,6 @@ static inline int __find_vmlinux_btf_id(struct btf *btf, const char *name,
      else
              err = btf__find_by_name_kind(btf, name, BTF_KIND_FUNC);

-     if (err <= 0)
-             pr_warn("%s is not found in vmlinux BTF\n", name);
-
      return err;
 }
@@ -8675,6 +8831,9 @@ int libbpf_find_vmlinux_btf_id(const char *name,
      }

      err = __find_vmlinux_btf_id(btf, name, attach_type);
+     if (err <= 0)
+             pr_warn("%s is not found in vmlinux BTF\n", name);
+
Please explain this move in the commit message.
ok, I'll add something about that. The short answer is that
__find_vmlinux_btf_id() is now expected to not find a type in vmlinux
BTF, so emitting error would be wrong. So I moved it up a level where
it's not expected.
quoted
      btf__free(btf);
      return err;
 }
--
2.24.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help