Commit-ID:  705fa2190dfb3d02f83adcd1abdb4e7dc3434597
Gitweb:     http://git.kernel.org/tip/705fa2190dfb3d02f83adcd1abdb4e7dc3434597
Author:     Wang Nan <wangn...@huawei.com>
AuthorDate: Wed, 13 Jul 2016 10:44:02 +0000
Committer:  Arnaldo Carvalho de Melo <a...@redhat.com>
CommitDate: Wed, 13 Jul 2016 23:09:02 -0300

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: Wang Nan <wangn...@huawei.com>
Cc: Alexei Starovoitov <a...@kernel.org>
Cc: Jiri Olsa <jo...@kernel.org>
Cc: Zefan Li <lize...@huawei.com>
Cc: pi3or...@163.com
Link: 
http://lkml.kernel.org/r/1468406646-21642-3-git-send-email-wangn...@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <a...@redhat.com>
---
 tools/lib/bpf/libbpf.c | 27 ++++++++++++++++++++-------
 tools/lib/bpf/libbpf.h |  1 +
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 4751936..32e6b6b 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -90,6 +90,7 @@ static const char *libbpf_strerror_table[NR_ERRNO] = {
        [ERRCODE_OFFSET(VERIFY)]        = "Kernel verifier blocks program 
loading",
        [ERRCODE_OFFSET(PROG2BIG)]      = "Program too big",
        [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)
@@ -926,15 +927,27 @@ load_program(enum bpf_prog_type type, struct bpf_insn 
*insns,
                pr_warning("-- BEGIN DUMP LOG ---\n");
                pr_warning("\n%s\n", log_buf);
                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 {
-               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 if (log_buf) {
-                       pr_warning("log buffer is empty\n");
-                       ret = -LIBBPF_ERRNO__KVER;
+               /* Wrong program type? */
+               if (type != BPF_PROG_TYPE_KPROBE) {
+                       int fd;
+
+                       fd = bpf_load_program(BPF_PROG_TYPE_KPROBE, insns,
+                                             insns_cnt, license, kern_version,
+                                             NULL, 0);
+                       if (fd >= 0) {
+                               close(fd);
+                               ret = -LIBBPF_ERRNO__PROGTYPE;
+                               goto out;
+                       }
                }
+
+               if (log_buf)
+                       ret = -LIBBPF_ERRNO__KVER;
        }
 
 out:
diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
index eb2a4c4..dd7a513 100644
--- a/tools/lib/bpf/libbpf.h
+++ b/tools/lib/bpf/libbpf.h
@@ -39,6 +39,7 @@ enum libbpf_errno {
        LIBBPF_ERRNO__VERIFY,   /* Kernel verifier blocks program loading */
        LIBBPF_ERRNO__PROG2BIG, /* Program too big */
        LIBBPF_ERRNO__KVER,     /* Incorrect kernel version */
+       LIBBPF_ERRNO__PROGTYPE, /* Kernel doesn't support this program type */
        __LIBBPF_ERRNO__END,
 };
 

Reply via email to