Commit 774e132e authored by Martin KaFai Lau's avatar Martin KaFai Lau Committed by Alexei Starovoitov

libbpf: Refactor codes for finding btf id of a kernel symbol

This patch refactors code, that finds kernel btf_id by kind
and symbol name, to a new function find_ksym_btf_id().

It also adds a new helper __btf_kind_str() to return
a string by the numeric kind value.
Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20210325015214.1547069-1-kafai@fb.com
parent 933d1aa3
...@@ -1921,9 +1921,9 @@ resolve_func_ptr(const struct btf *btf, __u32 id, __u32 *res_id) ...@@ -1921,9 +1921,9 @@ resolve_func_ptr(const struct btf *btf, __u32 id, __u32 *res_id)
return btf_is_func_proto(t) ? t : NULL; return btf_is_func_proto(t) ? t : NULL;
} }
static const char *btf_kind_str(const struct btf_type *t) static const char *__btf_kind_str(__u16 kind)
{ {
switch (btf_kind(t)) { switch (kind) {
case BTF_KIND_UNKN: return "void"; case BTF_KIND_UNKN: return "void";
case BTF_KIND_INT: return "int"; case BTF_KIND_INT: return "int";
case BTF_KIND_PTR: return "ptr"; case BTF_KIND_PTR: return "ptr";
...@@ -1945,6 +1945,11 @@ static const char *btf_kind_str(const struct btf_type *t) ...@@ -1945,6 +1945,11 @@ static const char *btf_kind_str(const struct btf_type *t)
} }
} }
static const char *btf_kind_str(const struct btf_type *t)
{
return __btf_kind_str(btf_kind(t));
}
/* /*
* Fetch integer attribute of BTF map definition. Such attributes are * Fetch integer attribute of BTF map definition. Such attributes are
* represented using a pointer to an array, in which dimensionality of array * represented using a pointer to an array, in which dimensionality of array
...@@ -7395,18 +7400,17 @@ static int bpf_object__read_kallsyms_file(struct bpf_object *obj) ...@@ -7395,18 +7400,17 @@ static int bpf_object__read_kallsyms_file(struct bpf_object *obj)
return err; return err;
} }
static int bpf_object__resolve_ksym_var_btf_id(struct bpf_object *obj, static int find_ksym_btf_id(struct bpf_object *obj, const char *ksym_name,
struct extern_desc *ext) __u16 kind, struct btf **res_btf,
int *res_btf_fd)
{ {
const struct btf_type *targ_var, *targ_type;
__u32 targ_type_id, local_type_id;
const char *targ_var_name;
int i, id, btf_fd, err; int i, id, btf_fd, err;
struct btf *btf; struct btf *btf;
btf = obj->btf_vmlinux; btf = obj->btf_vmlinux;
btf_fd = 0; btf_fd = 0;
id = btf__find_by_name_kind(btf, ext->name, BTF_KIND_VAR); id = btf__find_by_name_kind(btf, ksym_name, kind);
if (id == -ENOENT) { if (id == -ENOENT) {
err = load_module_btfs(obj); err = load_module_btfs(obj);
if (err) if (err)
...@@ -7416,17 +7420,35 @@ static int bpf_object__resolve_ksym_var_btf_id(struct bpf_object *obj, ...@@ -7416,17 +7420,35 @@ static int bpf_object__resolve_ksym_var_btf_id(struct bpf_object *obj,
btf = obj->btf_modules[i].btf; btf = obj->btf_modules[i].btf;
/* we assume module BTF FD is always >0 */ /* we assume module BTF FD is always >0 */
btf_fd = obj->btf_modules[i].fd; btf_fd = obj->btf_modules[i].fd;
id = btf__find_by_name_kind(btf, ext->name, BTF_KIND_VAR); id = btf__find_by_name_kind(btf, ksym_name, kind);
if (id != -ENOENT) if (id != -ENOENT)
break; break;
} }
} }
if (id <= 0) { if (id <= 0) {
pr_warn("extern (var ksym) '%s': failed to find BTF ID in kernel BTF(s).\n", pr_warn("extern (%s ksym) '%s': failed to find BTF ID in kernel BTF(s).\n",
ext->name); __btf_kind_str(kind), ksym_name);
return -ESRCH; return -ESRCH;
} }
*res_btf = btf;
*res_btf_fd = btf_fd;
return id;
}
static int bpf_object__resolve_ksym_var_btf_id(struct bpf_object *obj,
struct extern_desc *ext)
{
const struct btf_type *targ_var, *targ_type;
__u32 targ_type_id, local_type_id;
const char *targ_var_name;
int id, btf_fd = 0, err;
struct btf *btf = NULL;
id = find_ksym_btf_id(obj, ext->name, BTF_KIND_VAR, &btf, &btf_fd);
if (id < 0)
return id;
/* find local type_id */ /* find local type_id */
local_type_id = ext->ksym.type_id; local_type_id = ext->ksym.type_id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment