mirror of https://gitee.com/openkylin/linux.git
bpf: Expect !info.func_info and insn_off name changes in test_btf/libbpf/bpftool
Similar to info.jited_*, info.func_info could be 0 if bpf_dump_raw_ok() == false. This patch makes changes to test_btf and bpftool to expect info.func_info could be 0. This patch also makes the needed changes for s/insn_offset/insn_off/. Signed-off-by: Martin KaFai Lau <kafai@fb.com> Acked-by: Yonghong Song <yhs@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
555249df71
commit
84ecc1f98c
|
@ -589,6 +589,13 @@ static int do_dump(int argc, char **argv)
|
|||
goto err_free;
|
||||
}
|
||||
|
||||
if (func_info && !info.func_info) {
|
||||
/* kernel.kptr_restrict is set. No func_info available. */
|
||||
free(func_info);
|
||||
func_info = NULL;
|
||||
finfo_cnt = 0;
|
||||
}
|
||||
|
||||
if ((member_len == &info.jited_prog_len &&
|
||||
info.jited_prog_insns == 0) ||
|
||||
(member_len == &info.xlated_prog_len &&
|
||||
|
|
|
@ -261,7 +261,7 @@ void dump_xlated_json(struct dump_data *dd, void *buf, unsigned int len,
|
|||
jsonw_start_object(json_wtr);
|
||||
|
||||
if (btf && record) {
|
||||
if (record->insn_offset == i) {
|
||||
if (record->insn_off == i) {
|
||||
btf_dumper_type_only(btf, record->type_id,
|
||||
func_sig,
|
||||
sizeof(func_sig));
|
||||
|
@ -330,7 +330,7 @@ void dump_xlated_plain(struct dump_data *dd, void *buf, unsigned int len,
|
|||
}
|
||||
|
||||
if (btf && record) {
|
||||
if (record->insn_offset == i) {
|
||||
if (record->insn_off == i) {
|
||||
btf_dumper_type_only(btf, record->type_id,
|
||||
func_sig,
|
||||
sizeof(func_sig));
|
||||
|
|
|
@ -45,7 +45,7 @@ struct btf_ext {
|
|||
|
||||
/* The minimum bpf_func_info checked by the loader */
|
||||
struct bpf_func_info_min {
|
||||
__u32 insn_offset;
|
||||
__u32 insn_off;
|
||||
__u32 type_id;
|
||||
};
|
||||
|
||||
|
@ -670,7 +670,7 @@ int btf_ext__reloc_init(struct btf *btf, struct btf_ext *btf_ext,
|
|||
|
||||
memcpy(data, sinfo->data, records_len);
|
||||
|
||||
/* adjust the insn_offset, the data in .BTF.ext is
|
||||
/* adjust the insn_off, the data in .BTF.ext is
|
||||
* the actual byte offset, and the kernel expects
|
||||
* the offset in term of bpf_insn.
|
||||
*
|
||||
|
@ -681,7 +681,7 @@ int btf_ext__reloc_init(struct btf *btf, struct btf_ext *btf_ext,
|
|||
struct bpf_func_info_min *record;
|
||||
|
||||
record = data + i * record_size;
|
||||
record->insn_offset /= sizeof(struct bpf_insn);
|
||||
record->insn_off /= sizeof(struct bpf_insn);
|
||||
}
|
||||
|
||||
*func_info = data;
|
||||
|
@ -722,15 +722,15 @@ int btf_ext__reloc(struct btf *btf, struct btf_ext *btf_ext,
|
|||
return -ENOMEM;
|
||||
|
||||
memcpy(data + existing_flen, sinfo->data, records_len);
|
||||
/* adjust insn_offset only, the rest data will be passed
|
||||
/* adjust insn_off only, the rest data will be passed
|
||||
* to the kernel.
|
||||
*/
|
||||
for (i = 0; i < sinfo->num_func_info; i++) {
|
||||
struct bpf_func_info_min *record;
|
||||
|
||||
record = data + existing_flen + i * record_size;
|
||||
record->insn_offset =
|
||||
record->insn_offset / sizeof(struct bpf_insn) +
|
||||
record->insn_off =
|
||||
record->insn_off / sizeof(struct bpf_insn) +
|
||||
insns_cnt;
|
||||
}
|
||||
*func_info = data;
|
||||
|
|
|
@ -3156,7 +3156,7 @@ static struct btf_func_type_test {
|
|||
},
|
||||
|
||||
{
|
||||
.descr = "func_type (Incorrect bpf_func_info.insn_offset)",
|
||||
.descr = "func_type (Incorrect bpf_func_info.insn_off)",
|
||||
.raw_types = {
|
||||
BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
|
||||
BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4), /* [2] */
|
||||
|
@ -3303,6 +3303,12 @@ static int do_test_func_type(int test_num)
|
|||
goto done;
|
||||
}
|
||||
|
||||
if (CHECK(!info.func_info,
|
||||
"info.func_info == 0. kernel.kptr_restrict is set?")) {
|
||||
err = -1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
finfo = func_info;
|
||||
for (i = 0; i < 2; i++) {
|
||||
if (CHECK(finfo->type_id != test->func_info[i][1],
|
||||
|
|
Loading…
Reference in New Issue