]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
libbpf: support "module: Function" syntax for tracing programs
authorViktor Malik <vmalik@redhat.com>
Tue, 30 Apr 2024 09:38:06 +0000 (11:38 +0200)
committerAndrii Nakryiko <andrii@kernel.org>
Wed, 1 May 2024 16:53:47 +0000 (09:53 -0700)
In some situations, it is useful to explicitly specify a kernel module
to search for a tracing program target (e.g. when a function of the same
name exists in multiple modules or in vmlinux).

This patch enables that by allowing the "module:function" syntax for the
find_kernel_btf_id function. Thanks to this, the syntax can be used both
from a SEC macro (i.e. `SEC(fentry/module:function)`) and via the
bpf_program__set_attach_target API call.

Signed-off-by: Viktor Malik <vmalik@redhat.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/9085a8cb9a552de98e554deb22ff7e977d025440.1714469650.git.vmalik@redhat.com
tools/lib/bpf/libbpf.c

index 7667671187e9d76df4b64a49f05b38fd5d40601f..109b33fb68dc8daa5734f6c5cabffe718a6dc0ae 100644 (file)
@@ -9862,16 +9862,28 @@ static int find_kernel_btf_id(struct bpf_object *obj, const char *attach_name,
                              enum bpf_attach_type attach_type,
                              int *btf_obj_fd, int *btf_type_id)
 {
-       int ret, i;
+       int ret, i, mod_len;
+       const char *fn_name, *mod_name = NULL;
 
-       ret = find_attach_btf_id(obj->btf_vmlinux, attach_name, attach_type);
-       if (ret > 0) {
-               *btf_obj_fd = 0; /* vmlinux BTF */
-               *btf_type_id = ret;
-               return 0;
+       fn_name = strchr(attach_name, ':');
+       if (fn_name) {
+               mod_name = attach_name;
+               mod_len = fn_name - mod_name;
+               fn_name++;
+       }
+
+       if (!mod_name || strncmp(mod_name, "vmlinux", mod_len) == 0) {
+               ret = find_attach_btf_id(obj->btf_vmlinux,
+                                        mod_name ? fn_name : attach_name,
+                                        attach_type);
+               if (ret > 0) {
+                       *btf_obj_fd = 0; /* vmlinux BTF */
+                       *btf_type_id = ret;
+                       return 0;
+               }
+               if (ret != -ENOENT)
+                       return ret;
        }
-       if (ret != -ENOENT)
-               return ret;
 
        ret = load_module_btfs(obj);
        if (ret)
@@ -9880,7 +9892,12 @@ static int find_kernel_btf_id(struct bpf_object *obj, const char *attach_name,
        for (i = 0; i < obj->btf_module_cnt; i++) {
                const struct module_btf *mod = &obj->btf_modules[i];
 
-               ret = find_attach_btf_id(mod->btf, attach_name, attach_type);
+               if (mod_name && strncmp(mod->name, mod_name, mod_len) != 0)
+                       continue;
+
+               ret = find_attach_btf_id(mod->btf,
+                                        mod_name ? fn_name : attach_name,
+                                        attach_type);
                if (ret > 0) {
                        *btf_obj_fd = mod->fd;
                        *btf_type_id = ret;