samples/bpf: add tracepoint support to bpf loader
authorAlexei Starovoitov <ast@fb.com>
Thu, 7 Apr 2016 01:43:29 +0000 (18:43 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 8 Apr 2016 01:04:27 +0000 (21:04 -0400)
Recognize "tracepoint/" section name prefix and attach the program
to that tracepoint.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
samples/bpf/bpf_load.c

index 58f86bd11b3d239022d75a6c2c3a607bbb2ff61a..022af71c2bb5c0e894562e93cfecb1b857920e77 100644 (file)
@@ -49,6 +49,7 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
        bool is_socket = strncmp(event, "socket", 6) == 0;
        bool is_kprobe = strncmp(event, "kprobe/", 7) == 0;
        bool is_kretprobe = strncmp(event, "kretprobe/", 10) == 0;
+       bool is_tracepoint = strncmp(event, "tracepoint/", 11) == 0;
        enum bpf_prog_type prog_type;
        char buf[256];
        int fd, efd, err, id;
@@ -63,6 +64,8 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
                prog_type = BPF_PROG_TYPE_SOCKET_FILTER;
        } else if (is_kprobe || is_kretprobe) {
                prog_type = BPF_PROG_TYPE_KPROBE;
+       } else if (is_tracepoint) {
+               prog_type = BPF_PROG_TYPE_TRACEPOINT;
        } else {
                printf("Unknown event '%s'\n", event);
                return -1;
@@ -111,12 +114,23 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
                               event, strerror(errno));
                        return -1;
                }
-       }
 
-       strcpy(buf, DEBUGFS);
-       strcat(buf, "events/kprobes/");
-       strcat(buf, event);
-       strcat(buf, "/id");
+               strcpy(buf, DEBUGFS);
+               strcat(buf, "events/kprobes/");
+               strcat(buf, event);
+               strcat(buf, "/id");
+       } else if (is_tracepoint) {
+               event += 11;
+
+               if (*event == 0) {
+                       printf("event name cannot be empty\n");
+                       return -1;
+               }
+               strcpy(buf, DEBUGFS);
+               strcat(buf, "events/");
+               strcat(buf, event);
+               strcat(buf, "/id");
+       }
 
        efd = open(buf, O_RDONLY, 0);
        if (efd < 0) {
@@ -304,6 +318,7 @@ int load_bpf_file(char *path)
 
                        if (memcmp(shname_prog, "kprobe/", 7) == 0 ||
                            memcmp(shname_prog, "kretprobe/", 10) == 0 ||
+                           memcmp(shname_prog, "tracepoint/", 11) == 0 ||
                            memcmp(shname_prog, "socket", 6) == 0)
                                load_and_attach(shname_prog, insns, data_prog->d_size);
                }
@@ -320,6 +335,7 @@ int load_bpf_file(char *path)
 
                if (memcmp(shname, "kprobe/", 7) == 0 ||
                    memcmp(shname, "kretprobe/", 10) == 0 ||
+                   memcmp(shname, "tracepoint/", 11) == 0 ||
                    memcmp(shname, "socket", 6) == 0)
                        load_and_attach(shname, data->d_buf, data->d_size);
        }