bpf: Expect !info.func_info and insn_off name changes in test_btf/libbpf/bpftool
authorMartin KaFai Lau <kafai@fb.com>
Thu, 6 Dec 2018 01:35:47 +0000 (17:35 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 6 Dec 2018 02:48:40 +0000 (18:48 -0800)
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>
tools/bpf/bpftool/prog.c
tools/bpf/bpftool/xlated_dumper.c
tools/lib/bpf/btf.c
tools/testing/selftests/bpf/test_btf.c

index 54c8dbf05c9cb385788ade0f26b158627a09489f..a9a51123454c3e4fb8f1d0338881383b3eb6e9a9 100644 (file)
@@ -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 &&
index e06ac0286a750164adb2323f725bdfa8f49ec21d..131ecd175533046f3ae026ff54b59dadd1f8137f 100644 (file)
@@ -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));
index c2d641f3e16eee87b8d01c5c5e95e13ae6ff511d..85d6446cf83251a27f1cc9d04d2209819a885983 100644 (file)
@@ -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;
index bae7308b7ec5188e25983c2ea1fd988216bbf8f7..ff0952ea757a4c59a12ac2c75ae7616cb2a0a228 100644 (file)
@@ -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],