Commit 705fa219 authored by Wang Nan's avatar Wang Nan Committed by Arnaldo Carvalho de Melo

tools lib bpf: Report error when kernel doesn't support program type

Now libbpf support tracepoint program type. Report meaningful error when kernel
version is less than 4.7.
Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1468406646-21642-3-git-send-email-wangnan0@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 5f44e4c8
...@@ -90,6 +90,7 @@ static const char *libbpf_strerror_table[NR_ERRNO] = { ...@@ -90,6 +90,7 @@ static const char *libbpf_strerror_table[NR_ERRNO] = {
[ERRCODE_OFFSET(VERIFY)] = "Kernel verifier blocks program loading", [ERRCODE_OFFSET(VERIFY)] = "Kernel verifier blocks program loading",
[ERRCODE_OFFSET(PROG2BIG)] = "Program too big", [ERRCODE_OFFSET(PROG2BIG)] = "Program too big",
[ERRCODE_OFFSET(KVER)] = "Incorrect kernel version", [ERRCODE_OFFSET(KVER)] = "Incorrect kernel version",
[ERRCODE_OFFSET(PROGTYPE)] = "Kernel doesn't support this program type",
}; };
int libbpf_strerror(int err, char *buf, size_t size) int libbpf_strerror(int err, char *buf, size_t size)
...@@ -926,15 +927,27 @@ load_program(enum bpf_prog_type type, struct bpf_insn *insns, ...@@ -926,15 +927,27 @@ load_program(enum bpf_prog_type type, struct bpf_insn *insns,
pr_warning("-- BEGIN DUMP LOG ---\n"); pr_warning("-- BEGIN DUMP LOG ---\n");
pr_warning("\n%s\n", log_buf); pr_warning("\n%s\n", log_buf);
pr_warning("-- END LOG --\n"); pr_warning("-- END LOG --\n");
} else if (insns_cnt >= BPF_MAXINSNS) {
pr_warning("Program too large (%d insns), at most %d insns\n",
insns_cnt, BPF_MAXINSNS);
ret = -LIBBPF_ERRNO__PROG2BIG;
} else { } else {
if (insns_cnt >= BPF_MAXINSNS) { /* Wrong program type? */
pr_warning("Program too large (%d insns), at most %d insns\n", if (type != BPF_PROG_TYPE_KPROBE) {
insns_cnt, BPF_MAXINSNS); int fd;
ret = -LIBBPF_ERRNO__PROG2BIG;
} else if (log_buf) { fd = bpf_load_program(BPF_PROG_TYPE_KPROBE, insns,
pr_warning("log buffer is empty\n"); insns_cnt, license, kern_version,
ret = -LIBBPF_ERRNO__KVER; NULL, 0);
if (fd >= 0) {
close(fd);
ret = -LIBBPF_ERRNO__PROGTYPE;
goto out;
}
} }
if (log_buf)
ret = -LIBBPF_ERRNO__KVER;
} }
out: out:
......
...@@ -39,6 +39,7 @@ enum libbpf_errno { ...@@ -39,6 +39,7 @@ enum libbpf_errno {
LIBBPF_ERRNO__VERIFY, /* Kernel verifier blocks program loading */ LIBBPF_ERRNO__VERIFY, /* Kernel verifier blocks program loading */
LIBBPF_ERRNO__PROG2BIG, /* Program too big */ LIBBPF_ERRNO__PROG2BIG, /* Program too big */
LIBBPF_ERRNO__KVER, /* Incorrect kernel version */ LIBBPF_ERRNO__KVER, /* Incorrect kernel version */
LIBBPF_ERRNO__PROGTYPE, /* Kernel doesn't support this program type */
__LIBBPF_ERRNO__END, __LIBBPF_ERRNO__END,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment