static void * bpf_attach_probe(int progfd, const char *event, const char *event_desc, const char *event_type, pid_t pid, int cpu, int group_fd, perf_reader_cb cb, void *cb_cookie) { int kfd = -1; char buf[256]; struct perf_reader *reader = NULL; reader = perf_reader_new(cb, NULL, cb_cookie); if (!reader) goto error; snprintf(buf, sizeof(buf), "/sys/kernel/debug/tracing/%s_events", event_type); kfd = open(buf, O_WRONLY | O_APPEND, 0); if (kfd < 0) { fprintf(stderr, "open(%s): %s\n", buf, strerror(errno)); goto error; } if (write(kfd, event_desc, strlen(event_desc)) < 0) { fprintf(stderr, "write(%s, \"%s\") failed: %s\n", buf, event_desc, strerror(errno)); if (errno == EINVAL) fprintf(stderr, "check dmesg output for possible cause\n"); goto error; } snprintf(buf, sizeof(buf), "/sys/kernel/debug/tracing/events/%ss/%s", event_type, event); if (bpf_attach_tracing_event(progfd, buf, reader, pid, cpu, group_fd) < 0) goto error; return reader; error: if (kfd >= 0) close(kfd); if (reader) perf_reader_free(reader); return NULL; }
void * bpf_attach_kprobe(int progfd, const char *event, const char *event_desc, pid_t pid, int cpu, int group_fd, perf_reader_cb cb, void *cb_cookie) { int rc = -1, kfd = -1; char buf[256]; struct perf_reader *reader = NULL; reader = perf_reader_new(-1, 8, cb, cb_cookie); if (!reader) goto cleanup; kfd = open("/sys/kernel/debug/tracing/kprobe_events", O_WRONLY | O_APPEND, 0); if (kfd < 0) { perror("open(kprobe_events)"); goto cleanup; } if (write(kfd, event_desc, strlen(event_desc)) < 0) { fprintf(stderr, "write of \"%s\" into kprobe_events failed: %s\n", event_desc, strerror(errno)); if (errno == EINVAL) fprintf(stderr, "check dmesg output for possible cause\n"); goto cleanup; } snprintf(buf, sizeof(buf), "/sys/kernel/debug/tracing/events/kprobes/%s", event); rc = bpf_attach_tracing_event(progfd, buf, reader, pid, cpu, group_fd); cleanup: if (kfd >= 0) close(kfd); if (reader && rc < 0) { perf_reader_free(reader); reader = NULL; } return reader; }