]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - samples/bpf/bpf_load.c
Merge tag 'for-4.21/libata-20181221' of git://git.kernel.dk/linux-block
[linux.git] / samples / bpf / bpf_load.c
index e6d7e0fe155b47bd461f5d713e7a4eb4ad4e1ace..eae7b635343d13182a4d458d3280464f6ffee4ca 100644 (file)
@@ -54,6 +54,25 @@ static int populate_prog_array(const char *event, int prog_fd)
        return 0;
 }
 
+static int write_kprobe_events(const char *val)
+{
+       int fd, ret, flags;
+
+       if (val == NULL)
+               return -1;
+       else if (val[0] == '\0')
+               flags = O_WRONLY | O_TRUNC;
+       else
+               flags = O_WRONLY | O_APPEND;
+
+       fd = open("/sys/kernel/debug/tracing/kprobe_events", flags);
+
+       ret = write(fd, val, strlen(val));
+       close(fd);
+
+       return ret;
+}
+
 static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
 {
        bool is_socket = strncmp(event, "socket", 6) == 0;
@@ -165,10 +184,9 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
 
 #ifdef __x86_64__
                if (strncmp(event, "sys_", 4) == 0) {
-                       snprintf(buf, sizeof(buf),
-                                "echo '%c:__x64_%s __x64_%s' >> /sys/kernel/debug/tracing/kprobe_events",
-                                is_kprobe ? 'p' : 'r', event, event);
-                       err = system(buf);
+                       snprintf(buf, sizeof(buf), "%c:__x64_%s __x64_%s",
+                               is_kprobe ? 'p' : 'r', event, event);
+                       err = write_kprobe_events(buf);
                        if (err >= 0) {
                                need_normal_check = false;
                                event_prefix = "__x64_";
@@ -176,10 +194,9 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
                }
 #endif
                if (need_normal_check) {
-                       snprintf(buf, sizeof(buf),
-                                "echo '%c:%s %s' >> /sys/kernel/debug/tracing/kprobe_events",
-                                is_kprobe ? 'p' : 'r', event, event);
-                       err = system(buf);
+                       snprintf(buf, sizeof(buf), "%c:%s %s",
+                               is_kprobe ? 'p' : 'r', event, event);
+                       err = write_kprobe_events(buf);
                        if (err < 0) {
                                printf("failed to create kprobe '%s' error '%s'\n",
                                       event, strerror(errno));
@@ -284,8 +301,8 @@ static int load_maps(struct bpf_map_data *maps, int nr_maps,
                                                        numa_node);
                }
                if (map_fd[i] < 0) {
-                       printf("failed to create a map: %d %s\n",
-                              errno, strerror(errno));
+                       printf("failed to create map %d (%s): %d %s\n",
+                              i, maps[i].name, errno, strerror(errno));
                        return 1;
                }
                maps[i].fd = map_fd[i];
@@ -519,7 +536,7 @@ static int do_load_bpf_file(const char *path, fixup_map_cb fixup_map)
                return 1;
 
        /* clear all kprobes */
-       i = system("echo \"\" > /sys/kernel/debug/tracing/kprobe_events");
+       i = write_kprobe_events("");
 
        /* scan over all elf sections to get license and map info */
        for (i = 1; i < ehdr.e_shnum; i++) {