Patchwork [bpf-next,4/4] bpf: Expect !info.func_info and insn_off name changes in test_btf/libbpf/bpftool

login
register
mail settings
Submitter Martin KaFai Lau
Date Dec. 6, 2018, 1:35 a.m.
Message ID <20181206013547.2803539-1-kafai@fb.com>
Download mbox | patch
Permalink /patch/673721/
State New
Headers show

Comments

Martin KaFai Lau - Dec. 6, 2018, 1:35 a.m.
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>
---
 tools/bpf/bpftool/prog.c               |  7 +++++++
 tools/bpf/bpftool/xlated_dumper.c      |  4 ++--
 tools/lib/bpf/btf.c                    | 12 ++++++------
 tools/testing/selftests/bpf/test_btf.c |  8 +++++++-
 4 files changed, 22 insertions(+), 9 deletions(-)

Patch

diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c
index 56db61c5a91f..3148bc0e225b 100644
--- a/tools/bpf/bpftool/prog.c
+++ b/tools/bpf/bpftool/prog.c
@@ -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 &&
diff --git a/tools/bpf/bpftool/xlated_dumper.c b/tools/bpf/bpftool/xlated_dumper.c
index e06ac0286a75..131ecd175533 100644
--- a/tools/bpf/bpftool/xlated_dumper.c
+++ b/tools/bpf/bpftool/xlated_dumper.c
@@ -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));
diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c
index c2d641f3e16e..85d6446cf832 100644
--- a/tools/lib/bpf/btf.c
+++ b/tools/lib/bpf/btf.c
@@ -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;
diff --git a/tools/testing/selftests/bpf/test_btf.c b/tools/testing/selftests/bpf/test_btf.c
index bae7308b7ec5..ff0952ea757a 100644
--- a/tools/testing/selftests/bpf/test_btf.c
+++ b/tools/testing/selftests/bpf/test_btf.c
@@ -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],