Thread (27 messages) flat view 27 messages, 4 authors, 2021-01-12

Re: [PATCH v2 bpf-next 6/7] libbpf: support kernel module ksym externs

From: Andrii Nakryiko <hidden>
Date: 2021-01-11 21:40:34
Also in: bpf

On Mon, Jan 11, 2021 at 11:00 AM Hao Luo [off-list ref] wrote:
Acked-by: Hao Luo <redacted>, with a couple of nits.

On Fri, Jan 8, 2021 at 2:09 PM Andrii Nakryiko [off-list ref] wrote:
quoted
Add support for searching for ksym externs not just in vmlinux BTF, but across
all module BTFs, similarly to how it's done for CO-RE relocations. Kernels
that expose module BTFs through sysfs are assumed to support new ldimm64
instruction extension with BTF FD provided in insn[1].imm field, so no extra
feature detection is performed.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
---
 tools/lib/bpf/libbpf.c | 47 +++++++++++++++++++++++++++---------------
 1 file changed, 30 insertions(+), 17 deletions(-)
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 6ae748f6ea11..57559a71e4de 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
[...]
quoted
@@ -7319,7 +7321,8 @@ static int bpf_object__read_kallsyms_file(struct bpf_object *obj)
 static int bpf_object__resolve_ksyms_btf_id(struct bpf_object *obj)
 {
        struct extern_desc *ext;
-       int i, id;
+       struct btf *btf;
+       int i, j, id, btf_fd, err;

        for (i = 0; i < obj->nr_extern; i++) {
                const struct btf_type *targ_var, *targ_type;
@@ -7331,8 +7334,22 @@ static int bpf_object__resolve_ksyms_btf_id(struct bpf_object *obj)
                if (ext->type != EXT_KSYM || !ext->ksym.type_id)
                        continue;

-               id = btf__find_by_name_kind(obj->btf_vmlinux, ext->name,
-                                           BTF_KIND_VAR);
+               btf = obj->btf_vmlinux;
+               btf_fd = 0;
+               id = btf__find_by_name_kind(btf, ext->name, BTF_KIND_VAR);
Is "if (id <= 0)" better? Just in case, more error code is introduced in future.
There is id <= 0 right below after special-casing -ENOENT, so all
works as you want, no?
quoted
+               if (id == -ENOENT) {
+                       err = load_module_btfs(obj);
+                       if (err)
+                               return err;
+
+                       for (j = 0; j < obj->btf_module_cnt; j++) {
+                               btf = obj->btf_modules[j].btf;
+                               btf_fd = obj->btf_modules[j].fd;
+                               id = btf__find_by_name_kind(btf, ext->name, BTF_KIND_VAR);
+                               if (id != -ENOENT)
+                                       break;
+                       }
+               }
                if (id <= 0) {
Nit: the warning message isn't accurate any more, right? We also
searched kernel modules' BTF.
Right, how about just "failed to find BTF ID in kernel BTF"? Where
"kernel BTF" is "vmlinux BTF or any of kernel modules' BTFs"?
quoted
                        pr_warn("extern (ksym) '%s': failed to find BTF ID in vmlinux BTF.\n",
                                ext->name);
@@ -7343,24 +7360,19 @@ static int bpf_object__resolve_ksyms_btf_id(struct bpf_object *obj)
[...]
quoted
--
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