static void *perf_event_mmap(int fd) { int mmap_size = perf_mmap_size(); void *base; base = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (base == MAP_FAILED) { p_err("event mmap failed: %s\n", strerror(errno)); return NULL; } return base; }
/* Open a perf event with ring buffer for the current thread */ int perf_fd_open(struct perf_fd *p, struct perf_event_attr *attr, int buf_size_shift) { p->pfd = syscall(__NR_perf_event_open, attr, 0, -1, -1, 0); if (p->pfd < 0) return -1; struct perf_event_mmap_page *mpage; mpage = mmap(NULL, perf_mmap_size(buf_size_shift), PROT_READ|PROT_WRITE, MAP_SHARED, p->pfd, 0); if (mpage == (struct perf_event_mmap_page *)-1L) { close(p->pfd); return -1; } p->mpage = mpage; p->buf_size_shift = buf_size_shift; return 0; }
static void perf_event_unmap(void *mem) { if (munmap(mem, perf_mmap_size())) fprintf(stderr, "Can't unmap ring memory!\n"); }
void perf_fd_close(struct perf_fd *p) { munmap(p->mpage, perf_mmap_size(p->buf_size_shift)); close(p->pfd); p->mpage = NULL; }