Commit 933d1aa3 authored by Martin KaFai Lau's avatar Martin KaFai Lau Committed by Alexei Starovoitov
Browse files

libbpf: Refactor bpf_object__resolve_ksyms_btf_id



This patch refactors most of the logic from
bpf_object__resolve_ksyms_btf_id() into a new function
bpf_object__resolve_ksym_var_btf_id().
It is to get ready for a later patch adding
bpf_object__resolve_ksym_func_btf_id() which resolves
a kernel function to the running kernel btf_id.

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/20210325015207.1546749-1-kafai@fb.com
parent e78aea8b
Loading
Loading
Loading
Loading
+67 −57
Original line number Diff line number Diff line
@@ -7395,21 +7395,14 @@ static int bpf_object__read_kallsyms_file(struct bpf_object *obj)
	return err;
}

static int bpf_object__resolve_ksyms_btf_id(struct bpf_object *obj)
static int bpf_object__resolve_ksym_var_btf_id(struct bpf_object *obj,
					       struct extern_desc *ext)
{
	struct extern_desc *ext;
	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;
	__u32 targ_type_id, local_type_id;
	const char *targ_var_name;
		int ret;

		ext = &obj->externs[i];
		if (ext->type != EXT_KSYM || !ext->ksym.type_id)
			continue;
	int i, id, btf_fd, err;
	struct btf *btf;

	btf = obj->btf_vmlinux;
	btf_fd = 0;
@@ -7419,17 +7412,17 @@ static int bpf_object__resolve_ksyms_btf_id(struct bpf_object *obj)
		if (err)
			return err;

			for (j = 0; j < obj->btf_module_cnt; j++) {
				btf = obj->btf_modules[j].btf;
		for (i = 0; i < obj->btf_module_cnt; i++) {
			btf = obj->btf_modules[i].btf;
			/* we assume module BTF FD is always >0 */
				btf_fd = obj->btf_modules[j].fd;
			btf_fd = obj->btf_modules[i].fd;
			id = btf__find_by_name_kind(btf, ext->name, BTF_KIND_VAR);
			if (id != -ENOENT)
				break;
		}
	}
	if (id <= 0) {
			pr_warn("extern (ksym) '%s': failed to find BTF ID in kernel BTF(s).\n",
		pr_warn("extern (var ksym) '%s': failed to find BTF ID in kernel BTF(s).\n",
			ext->name);
		return -ESRCH;
	}
@@ -7442,9 +7435,9 @@ static int bpf_object__resolve_ksyms_btf_id(struct bpf_object *obj)
	targ_var_name = btf__name_by_offset(btf, targ_var->name_off);
	targ_type = skip_mods_and_typedefs(btf, targ_var->type, &targ_type_id);

		ret = bpf_core_types_are_compat(obj->btf, local_type_id,
	err = bpf_core_types_are_compat(obj->btf, local_type_id,
					btf, targ_type_id);
		if (ret <= 0) {
	if (err <= 0) {
		const struct btf_type *local_type;
		const char *targ_name, *local_name;

@@ -7452,7 +7445,7 @@ static int bpf_object__resolve_ksyms_btf_id(struct bpf_object *obj)
		local_name = btf__name_by_offset(obj->btf, local_type->name_off);
		targ_name = btf__name_by_offset(btf, targ_type->name_off);

			pr_warn("extern (ksym) '%s': incompatible types, expected [%d] %s %s, but kernel has [%d] %s %s\n",
		pr_warn("extern (var ksym) '%s': incompatible types, expected [%d] %s %s, but kernel has [%d] %s %s\n",
			ext->name, local_type_id,
			btf_kind_str(local_type), local_name, targ_type_id,
			btf_kind_str(targ_type), targ_name);
@@ -7462,8 +7455,25 @@ static int bpf_object__resolve_ksyms_btf_id(struct bpf_object *obj)
	ext->is_set = true;
	ext->ksym.kernel_btf_obj_fd = btf_fd;
	ext->ksym.kernel_btf_id = id;
		pr_debug("extern (ksym) '%s': resolved to [%d] %s %s\n",
	pr_debug("extern (var ksym) '%s': resolved to [%d] %s %s\n",
		 ext->name, id, btf_kind_str(targ_var), targ_var_name);

	return 0;
}

static int bpf_object__resolve_ksyms_btf_id(struct bpf_object *obj)
{
	struct extern_desc *ext;
	int i, err;

	for (i = 0; i < obj->nr_extern; i++) {
		ext = &obj->externs[i];
		if (ext->type != EXT_KSYM || !ext->ksym.type_id)
			continue;

		err = bpf_object__resolve_ksym_var_btf_id(obj, ext);
		if (err)
			return err;
	}
	return 0;
}