mirror of
https://github.com/netdata/libbpf.git
synced 2026-04-03 23:29:06 +08:00
libbpf: Simplify bpf_core_parse_spec() signature
Simplify bpf_core_parse_spec() signature to take struct bpf_core_relo as an input instead of requiring callers to decompose them into type_id, relo, spec_str, etc. This makes using and reusing this helper easier. Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20220426004511.2691730-9-andrii@kernel.org
This commit is contained in:
committed by
Andrii Nakryiko
parent
e2d8a820cb
commit
2c3a55bfe7
@@ -179,28 +179,27 @@ static bool core_relo_is_enumval_based(enum bpf_core_relo_kind kind)
|
|||||||
* string to specify enumerator's value index that need to be relocated.
|
* string to specify enumerator's value index that need to be relocated.
|
||||||
*/
|
*/
|
||||||
static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf,
|
static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf,
|
||||||
__u32 type_id,
|
const struct bpf_core_relo *relo,
|
||||||
const char *spec_str,
|
|
||||||
enum bpf_core_relo_kind relo_kind,
|
|
||||||
struct bpf_core_spec *spec)
|
struct bpf_core_spec *spec)
|
||||||
{
|
{
|
||||||
int access_idx, parsed_len, i;
|
int access_idx, parsed_len, i;
|
||||||
struct bpf_core_accessor *acc;
|
struct bpf_core_accessor *acc;
|
||||||
const struct btf_type *t;
|
const struct btf_type *t;
|
||||||
const char *name;
|
const char *name, *spec_str;
|
||||||
__u32 id;
|
__u32 id;
|
||||||
__s64 sz;
|
__s64 sz;
|
||||||
|
|
||||||
|
spec_str = btf__name_by_offset(btf, relo->access_str_off);
|
||||||
if (str_is_empty(spec_str) || *spec_str == ':')
|
if (str_is_empty(spec_str) || *spec_str == ':')
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
memset(spec, 0, sizeof(*spec));
|
memset(spec, 0, sizeof(*spec));
|
||||||
spec->btf = btf;
|
spec->btf = btf;
|
||||||
spec->root_type_id = type_id;
|
spec->root_type_id = relo->type_id;
|
||||||
spec->relo_kind = relo_kind;
|
spec->relo_kind = relo->kind;
|
||||||
|
|
||||||
/* type-based relocations don't have a field access string */
|
/* type-based relocations don't have a field access string */
|
||||||
if (core_relo_is_type_based(relo_kind)) {
|
if (core_relo_is_type_based(relo->kind)) {
|
||||||
if (strcmp(spec_str, "0"))
|
if (strcmp(spec_str, "0"))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
return 0;
|
return 0;
|
||||||
@@ -221,7 +220,7 @@ static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf,
|
|||||||
if (spec->raw_len == 0)
|
if (spec->raw_len == 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
t = skip_mods_and_typedefs(btf, type_id, &id);
|
t = skip_mods_and_typedefs(btf, relo->type_id, &id);
|
||||||
if (!t)
|
if (!t)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
@@ -231,7 +230,7 @@ static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf,
|
|||||||
acc->idx = access_idx;
|
acc->idx = access_idx;
|
||||||
spec->len++;
|
spec->len++;
|
||||||
|
|
||||||
if (core_relo_is_enumval_based(relo_kind)) {
|
if (core_relo_is_enumval_based(relo->kind)) {
|
||||||
if (!btf_is_enum(t) || spec->raw_len > 1 || access_idx >= btf_vlen(t))
|
if (!btf_is_enum(t) || spec->raw_len > 1 || access_idx >= btf_vlen(t))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
@@ -240,7 +239,7 @@ static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!core_relo_is_field_based(relo_kind))
|
if (!core_relo_is_field_based(relo->kind))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
sz = btf__resolve_size(btf, id);
|
sz = btf__resolve_size(btf, id);
|
||||||
@@ -301,7 +300,7 @@ static int bpf_core_parse_spec(const char *prog_name, const struct btf *btf,
|
|||||||
spec->bit_offset += access_idx * sz * 8;
|
spec->bit_offset += access_idx * sz * 8;
|
||||||
} else {
|
} else {
|
||||||
pr_warn("prog '%s': relo for [%u] %s (at idx %d) captures type [%d] of unexpected kind %s\n",
|
pr_warn("prog '%s': relo for [%u] %s (at idx %d) captures type [%d] of unexpected kind %s\n",
|
||||||
prog_name, type_id, spec_str, i, id, btf_kind_str(t));
|
prog_name, relo->type_id, spec_str, i, id, btf_kind_str(t));
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1182,7 +1181,6 @@ int bpf_core_calc_relo_insn(const char *prog_name,
|
|||||||
const struct btf_type *local_type;
|
const struct btf_type *local_type;
|
||||||
const char *local_name;
|
const char *local_name;
|
||||||
__u32 local_id;
|
__u32 local_id;
|
||||||
const char *spec_str;
|
|
||||||
char spec_buf[256];
|
char spec_buf[256];
|
||||||
int i, j, err;
|
int i, j, err;
|
||||||
|
|
||||||
@@ -1192,17 +1190,15 @@ int bpf_core_calc_relo_insn(const char *prog_name,
|
|||||||
if (!local_name)
|
if (!local_name)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
spec_str = btf__name_by_offset(local_btf, relo->access_str_off);
|
err = bpf_core_parse_spec(prog_name, local_btf, relo, local_spec);
|
||||||
if (str_is_empty(spec_str))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
err = bpf_core_parse_spec(prog_name, local_btf, local_id, spec_str,
|
|
||||||
relo->kind, local_spec);
|
|
||||||
if (err) {
|
if (err) {
|
||||||
|
const char *spec_str;
|
||||||
|
|
||||||
|
spec_str = btf__name_by_offset(local_btf, relo->access_str_off);
|
||||||
pr_warn("prog '%s': relo #%d: parsing [%d] %s %s + %s failed: %d\n",
|
pr_warn("prog '%s': relo #%d: parsing [%d] %s %s + %s failed: %d\n",
|
||||||
prog_name, relo_idx, local_id, btf_kind_str(local_type),
|
prog_name, relo_idx, local_id, btf_kind_str(local_type),
|
||||||
str_is_empty(local_name) ? "<anon>" : local_name,
|
str_is_empty(local_name) ? "<anon>" : local_name,
|
||||||
spec_str, err);
|
spec_str ?: "<?>", err);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user