mirror of
https://github.com/netdata/libbpf.git
synced 2026-04-10 18:49:06 +08:00
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: Martin KaFai Lau <kafai@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20210325015214.1547069-1-kafai@fb.com
This commit is contained in:
committed by
Andrii Nakryiko
parent
e5d7cbe15a
commit
7036f3356e
44
src/libbpf.c
44
src/libbpf.c
@@ -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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 @@ out:
|
|||||||
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,
|
|||||||
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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user