Commit d0e48edb authored by Teng Qin's avatar Teng Qin

Clean-up TRACEPOINT logic from perf reader

parent fafbf3ca
...@@ -1057,7 +1057,7 @@ void * bpf_open_perf_buffer(perf_reader_raw_cb raw_cb, ...@@ -1057,7 +1057,7 @@ void * bpf_open_perf_buffer(perf_reader_raw_cb raw_cb,
struct perf_event_attr attr = {}; struct perf_event_attr attr = {};
struct perf_reader *reader = NULL; struct perf_reader *reader = NULL;
reader = perf_reader_new(NULL, raw_cb, lost_cb, cb_cookie, page_cnt); reader = perf_reader_new(raw_cb, lost_cb, cb_cookie, page_cnt);
if (!reader) if (!reader)
goto error; goto error;
...@@ -1074,7 +1074,7 @@ void * bpf_open_perf_buffer(perf_reader_raw_cb raw_cb, ...@@ -1074,7 +1074,7 @@ void * bpf_open_perf_buffer(perf_reader_raw_cb raw_cb,
} }
perf_reader_set_fd(reader, pfd); perf_reader_set_fd(reader, pfd);
if (perf_reader_mmap(reader, attr.type, attr.sample_type) < 0) if (perf_reader_mmap(reader) < 0)
goto error; goto error;
if (ioctl(pfd, PERF_EVENT_IOC_ENABLE, 0) < 0) { if (ioctl(pfd, PERF_EVENT_IOC_ENABLE, 0) < 0) {
......
...@@ -65,8 +65,6 @@ int bpf_attach_socket(int sockfd, int progfd); ...@@ -65,8 +65,6 @@ int bpf_attach_socket(int sockfd, int progfd);
* bind the raw socket to the interface 'name' */ * bind the raw socket to the interface 'name' */
int bpf_open_raw_sock(const char *name); int bpf_open_raw_sock(const char *name);
typedef void (*perf_reader_cb)(void *cb_cookie, int pid, uint64_t callchain_num,
void *callchain);
typedef void (*perf_reader_raw_cb)(void *cb_cookie, void *raw, int raw_size); typedef void (*perf_reader_raw_cb)(void *cb_cookie, void *raw, int raw_size);
typedef void (*perf_reader_lost_cb)(void *cb_cookie, uint64_t lost); typedef void (*perf_reader_lost_cb)(void *cb_cookie, uint64_t lost);
......
...@@ -37,7 +37,6 @@ enum { ...@@ -37,7 +37,6 @@ enum {
}; };
struct perf_reader { struct perf_reader {
perf_reader_cb cb;
perf_reader_raw_cb raw_cb; perf_reader_raw_cb raw_cb;
perf_reader_lost_cb lost_cb; perf_reader_lost_cb lost_cb;
void *cb_cookie; // to be returned in the cb void *cb_cookie; // to be returned in the cb
...@@ -49,18 +48,14 @@ struct perf_reader { ...@@ -49,18 +48,14 @@ struct perf_reader {
int page_size; int page_size;
int page_cnt; int page_cnt;
int fd; int fd;
uint32_t type;
uint64_t sample_type;
}; };
struct perf_reader * perf_reader_new(perf_reader_cb cb, struct perf_reader * perf_reader_new(perf_reader_raw_cb raw_cb,
perf_reader_raw_cb raw_cb,
perf_reader_lost_cb lost_cb, perf_reader_lost_cb lost_cb,
void *cb_cookie, int page_cnt) { void *cb_cookie, int page_cnt) {
struct perf_reader *reader = calloc(1, sizeof(struct perf_reader)); struct perf_reader *reader = calloc(1, sizeof(struct perf_reader));
if (!reader) if (!reader)
return NULL; return NULL;
reader->cb = cb;
reader->raw_cb = raw_cb; reader->raw_cb = raw_cb;
reader->lost_cb = lost_cb; reader->lost_cb = lost_cb;
reader->cb_cookie = cb_cookie; reader->cb_cookie = cb_cookie;
...@@ -89,7 +84,7 @@ void perf_reader_free(void *ptr) { ...@@ -89,7 +84,7 @@ void perf_reader_free(void *ptr) {
} }
} }
int perf_reader_mmap(struct perf_reader *reader, unsigned type, unsigned long sample_type) { int perf_reader_mmap(struct perf_reader *reader) {
int mmap_size = reader->page_size * (reader->page_cnt + 1); int mmap_size = reader->page_size * (reader->page_cnt + 1);
if (reader->fd < 0) { if (reader->fd < 0) {
...@@ -102,8 +97,6 @@ int perf_reader_mmap(struct perf_reader *reader, unsigned type, unsigned long sa ...@@ -102,8 +97,6 @@ int perf_reader_mmap(struct perf_reader *reader, unsigned type, unsigned long sa
perror("mmap"); perror("mmap");
return -1; return -1;
} }
reader->type = type;
reader->sample_type = sample_type;
return 0; return 0;
} }
...@@ -120,69 +113,6 @@ struct perf_sample_trace_kprobe { ...@@ -120,69 +113,6 @@ struct perf_sample_trace_kprobe {
uint64_t ip; uint64_t ip;
}; };
static void parse_tracepoint(struct perf_reader *reader, void *data, int size) {
uint8_t *ptr = data;
struct perf_event_header *header = (void *)data;
struct perf_sample_trace_kprobe *tk = NULL;
uint64_t *callchain = NULL;
uint64_t num_callchain = 0;
ptr += sizeof(*header);
if (ptr > (uint8_t *)data + size) {
fprintf(stderr, "%s: corrupt sample header\n", __FUNCTION__);
return;
}
if (reader->sample_type & PERF_SAMPLE_CALLCHAIN) {
struct {
uint64_t nr;
uint64_t ips[0];
} *cc = (void *)ptr;
ptr += sizeof(cc->nr) + sizeof(*cc->ips) * cc->nr;
// size sanity check
if (ptr > (uint8_t *)data + size) {
fprintf(stderr, "%s: corrupt callchain sample\n", __FUNCTION__);
return;
}
int i;
// don't include magic numbers in the call chain
for (i = 0; i < cc->nr; ++i) {
if (cc->ips[i] == PERF_CONTEXT_USER)
break;
if (cc->ips[i] >= PERF_CONTEXT_MAX)
continue;
if (!callchain)
callchain = &cc->ips[i];
++num_callchain;
}
}
// for kprobes, raw samples just include the common data structure and the
// instruction pointer
if (reader->sample_type & PERF_SAMPLE_RAW) {
struct {
uint32_t size;
char data[0];
} *raw = (void *)ptr;
ptr += sizeof(raw->size) + raw->size;
if (ptr > (uint8_t *)data + size) {
fprintf(stderr, "%s: corrupt raw sample\n", __FUNCTION__);
return;
}
tk = (void *)raw->data;
}
// sanity check
if (ptr != (uint8_t *)data + size) {
fprintf(stderr, "%s: extra data at end of sample\n", __FUNCTION__);
return;
}
// call out to the user with the parsed data
if (reader->cb)
reader->cb(reader->cb_cookie, tk ? tk->common.pid : -1, num_callchain, callchain);
}
static void parse_sw(struct perf_reader *reader, void *data, int size) { static void parse_sw(struct perf_reader *reader, void *data, int size) {
uint8_t *ptr = data; uint8_t *ptr = data;
struct perf_event_header *header = (void *)data; struct perf_event_header *header = (void *)data;
...@@ -198,13 +128,11 @@ static void parse_sw(struct perf_reader *reader, void *data, int size) { ...@@ -198,13 +128,11 @@ static void parse_sw(struct perf_reader *reader, void *data, int size) {
return; return;
} }
if (reader->sample_type & PERF_SAMPLE_RAW) { raw = (void *)ptr;
raw = (void *)ptr; ptr += sizeof(raw->size) + raw->size;
ptr += sizeof(raw->size) + raw->size; if (ptr > (uint8_t *)data + size) {
if (ptr > (uint8_t *)data + size) { fprintf(stderr, "%s: corrupt raw sample\n", __FUNCTION__);
fprintf(stderr, "%s: corrupt raw sample\n", __FUNCTION__); return;
return;
}
} }
// sanity check // sanity check
...@@ -278,10 +206,7 @@ void perf_reader_event_read(struct perf_reader *reader) { ...@@ -278,10 +206,7 @@ void perf_reader_event_read(struct perf_reader *reader) {
fprintf(stderr, "Possibly lost %" PRIu64 " samples\n", lost); fprintf(stderr, "Possibly lost %" PRIu64 " samples\n", lost);
} }
} else if (e->type == PERF_RECORD_SAMPLE) { } else if (e->type == PERF_RECORD_SAMPLE) {
if (reader->type == PERF_TYPE_TRACEPOINT) parse_sw(reader, ptr, e->size);
parse_tracepoint(reader, ptr, e->size);
else if (reader->type == PERF_TYPE_SOFTWARE)
parse_sw(reader, ptr, e->size);
} else { } else {
fprintf(stderr, "%s: unknown sample type %d\n", __FUNCTION__, e->type); fprintf(stderr, "%s: unknown sample type %d\n", __FUNCTION__, e->type);
} }
......
...@@ -25,12 +25,11 @@ extern "C" { ...@@ -25,12 +25,11 @@ extern "C" {
struct perf_reader; struct perf_reader;
struct perf_reader * perf_reader_new(perf_reader_cb cb, struct perf_reader * perf_reader_new(perf_reader_raw_cb raw_cb,
perf_reader_raw_cb raw_cb,
perf_reader_lost_cb lost_cb, perf_reader_lost_cb lost_cb,
void *cb_cookie, int page_cnt); void *cb_cookie, int page_cnt);
void perf_reader_free(void *ptr); void perf_reader_free(void *ptr);
int perf_reader_mmap(struct perf_reader *reader, unsigned type, unsigned long sample_type); int perf_reader_mmap(struct perf_reader *reader);
void perf_reader_event_read(struct perf_reader *reader); void perf_reader_event_read(struct perf_reader *reader);
int perf_reader_poll(int num_readers, struct perf_reader **readers, int timeout); int perf_reader_poll(int num_readers, struct perf_reader **readers, int timeout);
int perf_reader_fd(struct perf_reader *reader); int perf_reader_fd(struct perf_reader *reader);
......
...@@ -99,7 +99,7 @@ ffi.cdef[[ ...@@ -99,7 +99,7 @@ ffi.cdef[[
struct perf_reader; struct perf_reader;
void perf_reader_free(void *ptr); void perf_reader_free(void *ptr);
int perf_reader_mmap(struct perf_reader *reader, unsigned type, unsigned long sample_type); int perf_reader_mmap(struct perf_reader *reader);
int perf_reader_poll(int num_readers, struct perf_reader **readers, int timeout); int perf_reader_poll(int num_readers, struct perf_reader **readers, int timeout);
int perf_reader_fd(struct perf_reader *reader); int perf_reader_fd(struct perf_reader *reader);
void perf_reader_set_fd(struct perf_reader *reader, int fd); void perf_reader_set_fd(struct perf_reader *reader, int fd);
......
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