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

bpf: Skip anonymous types in type lookup for performance



Currently, vmlinux and kernel module BTFs are unconditionally
sorted during the build phase, with named types placed at the
end. Thus, anonymous types should be skipped when starting the
search. In my vmlinux BTF, the number of anonymous types is
61,747, which means the loop count can be reduced by 61,747.

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-9-dolinux.peng@gmail.com
parent 342bf525
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -3534,7 +3534,8 @@ const char *btf_find_decl_tag_value(const struct btf *btf, const struct btf_type
	const struct btf_type *t;
	int len, id;

	id = btf_find_next_decl_tag(btf, pt, comp_idx, tag_key, 0);
	id = btf_find_next_decl_tag(btf, pt, comp_idx, tag_key,
				    btf_named_start_id(btf, false) - 1);
	if (id < 0)
		return ERR_PTR(id);

@@ -7844,12 +7845,13 @@ int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog)
			tname);
		return -EINVAL;
	}

	/* Convert BTF function arguments into verifier types.
	 * Only PTR_TO_CTX and SCALAR are supported atm.
	 */
	for (i = 0; i < nargs; i++) {
		u32 tags = 0;
		int id = 0;
		int id = btf_named_start_id(btf, false) - 1;

		/* 'arg:<tag>' decl_tag takes precedence over derivation of
		 * register type from BTF type itself
@@ -9338,7 +9340,7 @@ bpf_core_find_cands(struct bpf_core_ctx *ctx, u32 local_type_id)
	}

	/* Attempt to find target candidates in vmlinux BTF first */
	cands = bpf_core_add_cands(cands, main_btf, 1);
	cands = bpf_core_add_cands(cands, main_btf, btf_named_start_id(main_btf, true));
	if (IS_ERR(cands))
		return ERR_CAST(cands);

@@ -9370,7 +9372,7 @@ bpf_core_find_cands(struct bpf_core_ctx *ctx, u32 local_type_id)
		 */
		btf_get(mod_btf);
		spin_unlock_bh(&btf_idr_lock);
		cands = bpf_core_add_cands(cands, mod_btf, btf_nr_types(main_btf));
		cands = bpf_core_add_cands(cands, mod_btf, btf_named_start_id(mod_btf, true));
		btf_put(mod_btf);
		if (IS_ERR(cands))
			return ERR_CAST(cands);
+1 −6
Original line number Diff line number Diff line
@@ -20687,12 +20687,7 @@ static int find_btf_percpu_datasec(struct btf *btf)
	 * types to look at only module's own BTF types.
	 */
	n = btf_nr_types(btf);
	if (btf_is_module(btf))
		i = btf_nr_types(btf_vmlinux);
	else
		i = 1;
	for(; i < n; i++) {
	for (i = btf_named_start_id(btf, true); i < n; i++) {
		t = btf_type_by_id(btf, i);
		if (BTF_INFO_KIND(t->info) != BTF_KIND_DATASEC)
			continue;