mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	libbpf: Replace btf__type_by_id() with btf_type_by_id().
To prepare relo_core.c to be compiled in the kernel and the user space replace btf__type_by_id with btf_type_by_id. In libbpf btf__type_by_id and btf_type_by_id have different behavior. bpf_core_apply_relo_insn() needs behavior of uapi btf__type_by_id vs internal btf_type_by_id, but type_id range check is already done in bpf_core_apply_relo(), so it's safe to replace it everywhere. The kernel btf_type_by_id() does the check anyway. It doesn't hurt. Suggested-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Acked-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20211201181040.23337-2-alexei.starovoitov@gmail.com
This commit is contained in:
		
							parent
							
								
									64b5b97b8c
								
							
						
					
					
						commit
						74753e1462
					
				
					 3 changed files with 10 additions and 13 deletions
				
			
		| 
						 | 
					@ -454,7 +454,7 @@ const struct btf *btf__base_btf(const struct btf *btf)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* internal helper returning non-const pointer to a type */
 | 
					/* internal helper returning non-const pointer to a type */
 | 
				
			||||||
struct btf_type *btf_type_by_id(struct btf *btf, __u32 type_id)
 | 
					struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (type_id == 0)
 | 
						if (type_id == 0)
 | 
				
			||||||
		return &btf_void;
 | 
							return &btf_void;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -172,7 +172,7 @@ static inline void *libbpf_reallocarray(void *ptr, size_t nmemb, size_t size)
 | 
				
			||||||
struct btf;
 | 
					struct btf;
 | 
				
			||||||
struct btf_type;
 | 
					struct btf_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct btf_type *btf_type_by_id(struct btf *btf, __u32 type_id);
 | 
					struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id);
 | 
				
			||||||
const char *btf_kind_str(const struct btf_type *t);
 | 
					const char *btf_kind_str(const struct btf_type *t);
 | 
				
			||||||
const struct btf_type *skip_mods_and_typedefs(const struct btf *btf, __u32 id, __u32 *res_id);
 | 
					const struct btf_type *skip_mods_and_typedefs(const struct btf *btf, __u32 id, __u32 *res_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,7 @@ static bool is_flex_arr(const struct btf *btf,
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* has to be the last member of enclosing struct */
 | 
						/* has to be the last member of enclosing struct */
 | 
				
			||||||
	t = btf__type_by_id(btf, acc->type_id);
 | 
						t = btf_type_by_id(btf, acc->type_id);
 | 
				
			||||||
	return acc->idx == btf_vlen(t) - 1;
 | 
						return acc->idx == btf_vlen(t) - 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -388,7 +388,7 @@ static int bpf_core_match_member(const struct btf *local_btf,
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local_id = local_acc->type_id;
 | 
						local_id = local_acc->type_id;
 | 
				
			||||||
	local_type = btf__type_by_id(local_btf, local_id);
 | 
						local_type = btf_type_by_id(local_btf, local_id);
 | 
				
			||||||
	local_member = btf_members(local_type) + local_acc->idx;
 | 
						local_member = btf_members(local_type) + local_acc->idx;
 | 
				
			||||||
	local_name = btf__name_by_offset(local_btf, local_member->name_off);
 | 
						local_name = btf__name_by_offset(local_btf, local_member->name_off);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -580,7 +580,7 @@ static int bpf_core_calc_field_relo(const char *prog_name,
 | 
				
			||||||
		return -EUCLEAN; /* request instruction poisoning */
 | 
							return -EUCLEAN; /* request instruction poisoning */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	acc = &spec->spec[spec->len - 1];
 | 
						acc = &spec->spec[spec->len - 1];
 | 
				
			||||||
	t = btf__type_by_id(spec->btf, acc->type_id);
 | 
						t = btf_type_by_id(spec->btf, acc->type_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* a[n] accessor needs special handling */
 | 
						/* a[n] accessor needs special handling */
 | 
				
			||||||
	if (!acc->name) {
 | 
						if (!acc->name) {
 | 
				
			||||||
| 
						 | 
					@ -729,7 +729,7 @@ static int bpf_core_calc_enumval_relo(const struct bpf_core_relo *relo,
 | 
				
			||||||
	case BPF_ENUMVAL_VALUE:
 | 
						case BPF_ENUMVAL_VALUE:
 | 
				
			||||||
		if (!spec)
 | 
							if (!spec)
 | 
				
			||||||
			return -EUCLEAN; /* request instruction poisoning */
 | 
								return -EUCLEAN; /* request instruction poisoning */
 | 
				
			||||||
		t = btf__type_by_id(spec->btf, spec->spec[0].type_id);
 | 
							t = btf_type_by_id(spec->btf, spec->spec[0].type_id);
 | 
				
			||||||
		e = btf_enum(t) + spec->spec[0].idx;
 | 
							e = btf_enum(t) + spec->spec[0].idx;
 | 
				
			||||||
		*val = e->val;
 | 
							*val = e->val;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
| 
						 | 
					@ -805,8 +805,8 @@ static int bpf_core_calc_relo(const char *prog_name,
 | 
				
			||||||
		if (res->orig_sz != res->new_sz) {
 | 
							if (res->orig_sz != res->new_sz) {
 | 
				
			||||||
			const struct btf_type *orig_t, *new_t;
 | 
								const struct btf_type *orig_t, *new_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			orig_t = btf__type_by_id(local_spec->btf, res->orig_type_id);
 | 
								orig_t = btf_type_by_id(local_spec->btf, res->orig_type_id);
 | 
				
			||||||
			new_t = btf__type_by_id(targ_spec->btf, res->new_type_id);
 | 
								new_t = btf_type_by_id(targ_spec->btf, res->new_type_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* There are two use cases in which it's safe to
 | 
								/* There are two use cases in which it's safe to
 | 
				
			||||||
			 * adjust load/store's mem size:
 | 
								 * adjust load/store's mem size:
 | 
				
			||||||
| 
						 | 
					@ -1054,7 +1054,7 @@ static void bpf_core_dump_spec(int level, const struct bpf_core_spec *spec)
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	type_id = spec->root_type_id;
 | 
						type_id = spec->root_type_id;
 | 
				
			||||||
	t = btf__type_by_id(spec->btf, type_id);
 | 
						t = btf_type_by_id(spec->btf, type_id);
 | 
				
			||||||
	s = btf__name_by_offset(spec->btf, t->name_off);
 | 
						s = btf__name_by_offset(spec->btf, t->name_off);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	libbpf_print(level, "[%u] %s %s", type_id, btf_kind_str(t), str_is_empty(s) ? "<anon>" : s);
 | 
						libbpf_print(level, "[%u] %s %s", type_id, btf_kind_str(t), str_is_empty(s) ? "<anon>" : s);
 | 
				
			||||||
| 
						 | 
					@ -1158,10 +1158,7 @@ int bpf_core_apply_relo_insn(const char *prog_name, struct bpf_insn *insn,
 | 
				
			||||||
	int i, j, err;
 | 
						int i, j, err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local_id = relo->type_id;
 | 
						local_id = relo->type_id;
 | 
				
			||||||
	local_type = btf__type_by_id(local_btf, local_id);
 | 
						local_type = btf_type_by_id(local_btf, local_id);
 | 
				
			||||||
	if (!local_type)
 | 
					 | 
				
			||||||
		return -EINVAL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local_name = btf__name_by_offset(local_btf, local_type->name_off);
 | 
						local_name = btf__name_by_offset(local_btf, local_type->name_off);
 | 
				
			||||||
	if (!local_name)
 | 
						if (!local_name)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue