Commit 434bcbc8 authored by Donglin Peng's avatar Donglin Peng Committed by Andrii Nakryiko
Browse files

bpf: Optimize the performance of find_bpffs_btf_enums



Currently, vmlinux BTF is unconditionally sorted during
the build phase. The function btf_find_by_name_kind
executes the binary search branch, so find_bpffs_btf_enums
can be optimized by using btf_find_by_name_kind.

Signed-off-by: default avatarDonglin Peng <pengdonglin@xiaomi.com>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Acked-by: default avatarEduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/bpf/20260109130003.3313716-10-dolinux.peng@gmail.com
parent dc893cfa
Loading
Loading
Loading
Loading
+17 −25
Original line number Diff line number Diff line
@@ -600,10 +600,17 @@ struct bpffs_btf_enums {

static int find_bpffs_btf_enums(struct bpffs_btf_enums *info)
{
	const struct btf *btf;
	const struct btf_type *t;
	struct {
		const struct btf_type **type;
		const char *name;
	int i, n;
	} btf_enums[] = {
		{&info->cmd_t,		"bpf_cmd"},
		{&info->map_t,		"bpf_map_type"},
		{&info->prog_t,		"bpf_prog_type"},
		{&info->attach_t,	"bpf_attach_type"},
	};
	const struct btf *btf;
	int i, id;

	memset(info, 0, sizeof(*info));

@@ -615,31 +622,16 @@ static int find_bpffs_btf_enums(struct bpffs_btf_enums *info)

	info->btf = btf;

	for (i = 1, n = btf_nr_types(btf); i < n; i++) {
		t = btf_type_by_id(btf, i);
		if (!btf_type_is_enum(t))
			continue;

		name = btf_name_by_offset(btf, t->name_off);
		if (!name)
			continue;

		if (strcmp(name, "bpf_cmd") == 0)
			info->cmd_t = t;
		else if (strcmp(name, "bpf_map_type") == 0)
			info->map_t = t;
		else if (strcmp(name, "bpf_prog_type") == 0)
			info->prog_t = t;
		else if (strcmp(name, "bpf_attach_type") == 0)
			info->attach_t = t;
		else
			continue;
	for (i = 0; i < ARRAY_SIZE(btf_enums); i++) {
		id = btf_find_by_name_kind(btf, btf_enums[i].name,
					   BTF_KIND_ENUM);
		if (id < 0)
			return -ESRCH;

		if (info->cmd_t && info->map_t && info->prog_t && info->attach_t)
			return 0;
		*btf_enums[i].type = btf_type_by_id(btf, id);
	}

	return -ESRCH;
	return 0;
}

static bool find_btf_enum_const(const struct btf *btf, const struct btf_type *enum_t,