Lines Matching refs:evsel

5 #include <perf/evsel.h>
9 #include <internal/evsel.h>
22 void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *attr,
25 INIT_LIST_HEAD(&evsel->node);
26 evsel->attr = *attr;
27 evsel->idx = idx;
28 evsel->leader = evsel;
33 struct perf_evsel *evsel = zalloc(sizeof(*evsel));
35 if (evsel != NULL)
36 perf_evsel__init(evsel, attr, 0);
38 return evsel;
41 void perf_evsel__delete(struct perf_evsel *evsel)
43 free(evsel);
52 int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads)
54 evsel->fd = xyarray__new(ncpus, nthreads, sizeof(int));
56 if (evsel->fd) {
61 int *fd = FD(evsel, idx, thread);
69 return evsel->fd != NULL ? 0 : -ENOMEM;
72 static int perf_evsel__alloc_mmap(struct perf_evsel *evsel, int ncpus, int nthreads)
74 evsel->mmap = xyarray__new(ncpus, nthreads, sizeof(struct perf_mmap));
76 return evsel->mmap != NULL ? 0 : -ENOMEM;
87 static int get_group_fd(struct perf_evsel *evsel, int cpu_map_idx, int thread, int *group_fd)
89 struct perf_evsel *leader = evsel->leader;
92 if (evsel == leader) {
113 int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus,
143 if (evsel->fd == NULL &&
144 perf_evsel__alloc_fd(evsel, perf_cpu_map__nr(cpus), threads->nr) < 0)
151 evsel_fd = FD(evsel, idx, thread);
157 err = get_group_fd(evsel, idx, thread, &group_fd);
161 fd = sys_perf_event_open(&evsel->attr,
175 perf_evsel__close(evsel);
180 static void perf_evsel__close_fd_cpu(struct perf_evsel *evsel, int cpu_map_idx)
184 for (thread = 0; thread < xyarray__max_y(evsel->fd); ++thread) {
185 int *fd = FD(evsel, cpu_map_idx, thread);
194 void perf_evsel__close_fd(struct perf_evsel *evsel)
196 for (int idx = 0; idx < xyarray__max_x(evsel->fd); idx++)
197 perf_evsel__close_fd_cpu(evsel, idx);
200 void perf_evsel__free_fd(struct perf_evsel *evsel)
202 xyarray__delete(evsel->fd);
203 evsel->fd = NULL;
206 void perf_evsel__close(struct perf_evsel *evsel)
208 if (evsel->fd == NULL)
211 perf_evsel__close_fd(evsel);
212 perf_evsel__free_fd(evsel);
215 void perf_evsel__close_cpu(struct perf_evsel *evsel, int cpu_map_idx)
217 if (evsel->fd == NULL)
220 perf_evsel__close_fd_cpu(evsel, cpu_map_idx);
223 void perf_evsel__munmap(struct perf_evsel *evsel)
227 if (evsel->fd == NULL || evsel->mmap == NULL)
230 for (idx = 0; idx < xyarray__max_x(evsel->fd); idx++) {
231 for (thread = 0; thread < xyarray__max_y(evsel->fd); thread++) {
232 int *fd = FD(evsel, idx, thread);
237 perf_mmap__munmap(MMAP(evsel, idx, thread));
241 xyarray__delete(evsel->mmap);
242 evsel->mmap = NULL;
245 int perf_evsel__mmap(struct perf_evsel *evsel, int pages)
253 if (evsel->fd == NULL || evsel->mmap)
256 if (perf_evsel__alloc_mmap(evsel, xyarray__max_x(evsel->fd), xyarray__max_y(evsel->fd)) < 0)
259 for (idx = 0; idx < xyarray__max_x(evsel->fd); idx++) {
260 for (thread = 0; thread < xyarray__max_y(evsel->fd); thread++) {
261 int *fd = FD(evsel, idx, thread);
263 struct perf_cpu cpu = perf_cpu_map__cpu(evsel->cpus, idx);
268 map = MMAP(evsel, idx, thread);
273 perf_evsel__munmap(evsel);
282 void *perf_evsel__mmap_base(struct perf_evsel *evsel, int cpu_map_idx, int thread)
284 int *fd = FD(evsel, cpu_map_idx, thread);
286 if (fd == NULL || *fd < 0 || MMAP(evsel, cpu_map_idx, thread) == NULL)
289 return MMAP(evsel, cpu_map_idx, thread)->base;
292 int perf_evsel__read_size(struct perf_evsel *evsel)
294 u64 read_format = evsel->attr.read_format;
312 nr = evsel->nr_members;
321 static int perf_evsel__read_group(struct perf_evsel *evsel, int cpu_map_idx,
324 size_t size = perf_evsel__read_size(evsel);
325 int *fd = FD(evsel, cpu_map_idx, thread);
326 u64 read_format = evsel->attr.read_format;
366 static void perf_evsel__adjust_values(struct perf_evsel *evsel, u64 *buf,
369 u64 read_format = evsel->attr.read_format;
387 int perf_evsel__read(struct perf_evsel *evsel, int cpu_map_idx, int thread,
390 size_t size = perf_evsel__read_size(evsel);
391 int *fd = FD(evsel, cpu_map_idx, thread);
392 u64 read_format = evsel->attr.read_format;
401 return perf_evsel__read_group(evsel, cpu_map_idx, thread, count);
403 if (MMAP(evsel, cpu_map_idx, thread) &&
405 !perf_mmap__read_self(MMAP(evsel, cpu_map_idx, thread), count))
411 perf_evsel__adjust_values(evsel, buf.values, count);
415 static int perf_evsel__ioctl(struct perf_evsel *evsel, int ioc, void *arg,
418 int *fd = FD(evsel, cpu_map_idx, thread);
426 static int perf_evsel__run_ioctl(struct perf_evsel *evsel,
432 for (thread = 0; thread < xyarray__max_y(evsel->fd); thread++) {
433 int err = perf_evsel__ioctl(evsel, ioc, arg, cpu_map_idx, thread);
442 int perf_evsel__enable_cpu(struct perf_evsel *evsel, int cpu_map_idx)
444 return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_ENABLE, NULL, cpu_map_idx);
447 int perf_evsel__enable_thread(struct perf_evsel *evsel, int thread)
453 perf_cpu_map__for_each_cpu(cpu, idx, evsel->cpus) {
454 err = perf_evsel__ioctl(evsel, PERF_EVENT_IOC_ENABLE, NULL, idx, thread);
462 int perf_evsel__enable(struct perf_evsel *evsel)
467 for (i = 0; i < xyarray__max_x(evsel->fd) && !err; i++)
468 err = perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_ENABLE, NULL, i);
472 int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu_map_idx)
474 return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_DISABLE, NULL, cpu_map_idx);
477 int perf_evsel__disable(struct perf_evsel *evsel)
482 for (i = 0; i < xyarray__max_x(evsel->fd) && !err; i++)
483 err = perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_DISABLE, NULL, i);
487 int perf_evsel__apply_filter(struct perf_evsel *evsel, const char *filter)
491 for (i = 0; i < perf_cpu_map__nr(evsel->cpus) && !err; i++)
492 err = perf_evsel__run_ioctl(evsel,
498 struct perf_cpu_map *perf_evsel__cpus(struct perf_evsel *evsel)
500 return evsel->cpus;
503 struct perf_thread_map *perf_evsel__threads(struct perf_evsel *evsel)
505 return evsel->threads;
508 struct perf_event_attr *perf_evsel__attr(struct perf_evsel *evsel)
510 return &evsel->attr;
513 int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads)
518 evsel->sample_id = xyarray__new(ncpus, nthreads, sizeof(struct perf_sample_id));
519 if (evsel->sample_id == NULL)
522 evsel->id = zalloc(ncpus * nthreads * sizeof(u64));
523 if (evsel->id == NULL) {
524 xyarray__delete(evsel->sample_id);
525 evsel->sample_id = NULL;
532 void perf_evsel__free_id(struct perf_evsel *evsel)
534 xyarray__delete(evsel->sample_id);
535 evsel->sample_id = NULL;
536 zfree(&evsel->id);
537 evsel->ids = 0;