Lines Matching refs:evlist

28 void perf_evlist__init(struct perf_evlist *evlist)  in perf_evlist__init()  argument
30 INIT_LIST_HEAD(&evlist->entries); in perf_evlist__init()
31 evlist->nr_entries = 0; in perf_evlist__init()
32 fdarray__init(&evlist->pollfd, 64); in perf_evlist__init()
33 perf_evlist__reset_id_hash(evlist); in perf_evlist__init()
36 static void __perf_evlist__propagate_maps(struct perf_evlist *evlist, in __perf_evlist__propagate_maps() argument
43 } else if (evlist->has_user_cpus && evsel->is_pmu_core) { in __perf_evlist__propagate_maps()
49 evsel->cpus = perf_cpu_map__intersect(evlist->user_requested_cpus, evsel->own_cpus); in __perf_evlist__propagate_maps()
50 } else if (!evsel->own_cpus || evlist->has_user_cpus || in __perf_evlist__propagate_maps()
51 (!evsel->requires_cpu && perf_cpu_map__has_any_cpu(evlist->user_requested_cpus))) { in __perf_evlist__propagate_maps()
60 evsel->cpus = perf_cpu_map__get(evlist->user_requested_cpus); in __perf_evlist__propagate_maps()
75 evsel->threads = perf_thread_map__get(evlist->threads); in __perf_evlist__propagate_maps()
78 evlist->all_cpus = perf_cpu_map__merge(evlist->all_cpus, evsel->cpus); in __perf_evlist__propagate_maps()
81 static void perf_evlist__propagate_maps(struct perf_evlist *evlist) in perf_evlist__propagate_maps() argument
85 evlist->needs_map_propagation = true; in perf_evlist__propagate_maps()
87 perf_evlist__for_each_evsel(evlist, evsel) in perf_evlist__propagate_maps()
88 __perf_evlist__propagate_maps(evlist, evsel); in perf_evlist__propagate_maps()
91 void perf_evlist__add(struct perf_evlist *evlist, in perf_evlist__add() argument
94 evsel->idx = evlist->nr_entries; in perf_evlist__add()
95 list_add_tail(&evsel->node, &evlist->entries); in perf_evlist__add()
96 evlist->nr_entries += 1; in perf_evlist__add()
98 if (evlist->needs_map_propagation) in perf_evlist__add()
99 __perf_evlist__propagate_maps(evlist, evsel); in perf_evlist__add()
102 void perf_evlist__remove(struct perf_evlist *evlist, in perf_evlist__remove() argument
106 evlist->nr_entries -= 1; in perf_evlist__remove()
111 struct perf_evlist *evlist = zalloc(sizeof(*evlist)); in perf_evlist__new() local
113 if (evlist != NULL) in perf_evlist__new()
114 perf_evlist__init(evlist); in perf_evlist__new()
116 return evlist; in perf_evlist__new()
120 perf_evlist__next(struct perf_evlist *evlist, struct perf_evsel *prev) in perf_evlist__next() argument
125 next = list_first_entry(&evlist->entries, in perf_evlist__next()
133 if (&next->node == &evlist->entries) in perf_evlist__next()
139 static void perf_evlist__purge(struct perf_evlist *evlist) in perf_evlist__purge() argument
143 perf_evlist__for_each_entry_safe(evlist, n, pos) { in perf_evlist__purge()
148 evlist->nr_entries = 0; in perf_evlist__purge()
151 void perf_evlist__exit(struct perf_evlist *evlist) in perf_evlist__exit() argument
153 perf_cpu_map__put(evlist->user_requested_cpus); in perf_evlist__exit()
154 perf_cpu_map__put(evlist->all_cpus); in perf_evlist__exit()
155 perf_thread_map__put(evlist->threads); in perf_evlist__exit()
156 evlist->user_requested_cpus = NULL; in perf_evlist__exit()
157 evlist->all_cpus = NULL; in perf_evlist__exit()
158 evlist->threads = NULL; in perf_evlist__exit()
159 fdarray__exit(&evlist->pollfd); in perf_evlist__exit()
162 void perf_evlist__delete(struct perf_evlist *evlist) in perf_evlist__delete() argument
164 if (evlist == NULL) in perf_evlist__delete()
167 perf_evlist__munmap(evlist); in perf_evlist__delete()
168 perf_evlist__close(evlist); in perf_evlist__delete()
169 perf_evlist__purge(evlist); in perf_evlist__delete()
170 perf_evlist__exit(evlist); in perf_evlist__delete()
171 free(evlist); in perf_evlist__delete()
174 void perf_evlist__set_maps(struct perf_evlist *evlist, in perf_evlist__set_maps() argument
185 if (cpus != evlist->user_requested_cpus) { in perf_evlist__set_maps()
186 perf_cpu_map__put(evlist->user_requested_cpus); in perf_evlist__set_maps()
187 evlist->user_requested_cpus = perf_cpu_map__get(cpus); in perf_evlist__set_maps()
190 if (threads != evlist->threads) { in perf_evlist__set_maps()
191 perf_thread_map__put(evlist->threads); in perf_evlist__set_maps()
192 evlist->threads = perf_thread_map__get(threads); in perf_evlist__set_maps()
195 perf_evlist__propagate_maps(evlist); in perf_evlist__set_maps()
198 int perf_evlist__open(struct perf_evlist *evlist) in perf_evlist__open() argument
203 perf_evlist__for_each_entry(evlist, evsel) { in perf_evlist__open()
212 perf_evlist__close(evlist); in perf_evlist__open()
216 void perf_evlist__close(struct perf_evlist *evlist) in perf_evlist__close() argument
220 perf_evlist__for_each_entry_reverse(evlist, evsel) in perf_evlist__close()
224 void perf_evlist__enable(struct perf_evlist *evlist) in perf_evlist__enable() argument
228 perf_evlist__for_each_entry(evlist, evsel) in perf_evlist__enable()
232 void perf_evlist__disable(struct perf_evlist *evlist) in perf_evlist__disable() argument
236 perf_evlist__for_each_entry(evlist, evsel) in perf_evlist__disable()
240 u64 perf_evlist__read_format(struct perf_evlist *evlist) in perf_evlist__read_format() argument
242 struct perf_evsel *first = perf_evlist__first(evlist); in perf_evlist__read_format()
249 static void perf_evlist__id_hash(struct perf_evlist *evlist, in perf_evlist__id_hash() argument
259 hlist_add_head(&sid->node, &evlist->heads[hash]); in perf_evlist__id_hash()
262 void perf_evlist__reset_id_hash(struct perf_evlist *evlist) in perf_evlist__reset_id_hash() argument
267 INIT_HLIST_HEAD(&evlist->heads[i]); in perf_evlist__reset_id_hash()
270 void perf_evlist__id_add(struct perf_evlist *evlist, in perf_evlist__id_add() argument
277 perf_evlist__id_hash(evlist, evsel, cpu_map_idx, thread, id); in perf_evlist__id_add()
281 int perf_evlist__id_add_fd(struct perf_evlist *evlist, in perf_evlist__id_add_fd() argument
306 if (perf_evlist__read_format(evlist) & PERF_FORMAT_GROUP) in perf_evlist__id_add_fd()
321 perf_evlist__id_add(evlist, evsel, cpu_map_idx, thread, id); in perf_evlist__id_add_fd()
325 int perf_evlist__alloc_pollfd(struct perf_evlist *evlist) in perf_evlist__alloc_pollfd() argument
327 int nr_cpus = perf_cpu_map__nr(evlist->all_cpus); in perf_evlist__alloc_pollfd()
328 int nr_threads = perf_thread_map__nr(evlist->threads); in perf_evlist__alloc_pollfd()
332 perf_evlist__for_each_entry(evlist, evsel) { in perf_evlist__alloc_pollfd()
339 if (fdarray__available_entries(&evlist->pollfd) < nfds && in perf_evlist__alloc_pollfd()
340 fdarray__grow(&evlist->pollfd, nfds) < 0) in perf_evlist__alloc_pollfd()
346 int perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd, in perf_evlist__add_pollfd() argument
349 int pos = fdarray__add(&evlist->pollfd, fd, revent | POLLERR | POLLHUP, flags); in perf_evlist__add_pollfd()
352 evlist->pollfd.priv[pos].ptr = ptr; in perf_evlist__add_pollfd()
368 int perf_evlist__filter_pollfd(struct perf_evlist *evlist, short revents_and_mask) in perf_evlist__filter_pollfd() argument
370 return fdarray__filter(&evlist->pollfd, revents_and_mask, in perf_evlist__filter_pollfd()
374 int perf_evlist__poll(struct perf_evlist *evlist, int timeout) in perf_evlist__poll() argument
376 return fdarray__poll(&evlist->pollfd, timeout); in perf_evlist__poll()
379 static struct perf_mmap* perf_evlist__alloc_mmap(struct perf_evlist *evlist, bool overwrite) in perf_evlist__alloc_mmap() argument
384 map = zalloc(evlist->nr_mmaps * sizeof(struct perf_mmap)); in perf_evlist__alloc_mmap()
388 for (i = 0; i < evlist->nr_mmaps; i++) { in perf_evlist__alloc_mmap()
416 perf_evlist__mmap_cb_get(struct perf_evlist *evlist, bool overwrite, int idx) in perf_evlist__mmap_cb_get() argument
420 maps = overwrite ? evlist->mmap_ovw : evlist->mmap; in perf_evlist__mmap_cb_get()
423 maps = perf_evlist__alloc_mmap(evlist, overwrite); in perf_evlist__mmap_cb_get()
428 evlist->mmap_ovw = maps; in perf_evlist__mmap_cb_get()
430 evlist->mmap = maps; in perf_evlist__mmap_cb_get()
445 static void perf_evlist__set_mmap_first(struct perf_evlist *evlist, struct perf_mmap *map, in perf_evlist__set_mmap_first() argument
449 evlist->mmap_ovw_first = map; in perf_evlist__set_mmap_first()
451 evlist->mmap_first = map; in perf_evlist__set_mmap_first()
455 mmap_per_evsel(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops, in mmap_per_evsel() argument
459 struct perf_cpu evlist_cpu = perf_cpu_map__cpu(evlist->all_cpus, cpu_idx); in mmap_per_evsel()
463 perf_evlist__for_each_entry(evlist, evsel) { in mmap_per_evsel()
476 map = ops->get(evlist, overwrite, idx); in mmap_per_evsel()
509 ops->idx(evlist, evsel, mp, idx); in mmap_per_evsel()
519 perf_evlist__set_mmap_first(evlist, map, overwrite); in mmap_per_evsel()
532 if (perf_evlist__add_pollfd(evlist, fd, map, revent, flgs) < 0) { in mmap_per_evsel()
538 if (perf_evlist__id_add_fd(evlist, evsel, cpu, thread, in mmap_per_evsel()
549 mmap_per_thread(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops, in mmap_per_thread() argument
552 int nr_threads = perf_thread_map__nr(evlist->threads); in mmap_per_thread()
553 int nr_cpus = perf_cpu_map__nr(evlist->all_cpus); in mmap_per_thread()
565 if (mmap_per_evsel(evlist, ops, idx, mp, 0, thread, &output, in mmap_per_thread()
575 if (mmap_per_evsel(evlist, ops, idx, mp, cpu, 0, &output, in mmap_per_thread()
580 if (nr_mmaps != evlist->nr_mmaps) in mmap_per_thread()
581 pr_err("Miscounted nr_mmaps %d vs %d\n", nr_mmaps, evlist->nr_mmaps); in mmap_per_thread()
586 perf_evlist__munmap(evlist); in mmap_per_thread()
591 mmap_per_cpu(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops, in mmap_per_cpu() argument
594 int nr_threads = perf_thread_map__nr(evlist->threads); in mmap_per_cpu()
595 int nr_cpus = perf_cpu_map__nr(evlist->all_cpus); in mmap_per_cpu()
606 if (mmap_per_evsel(evlist, ops, cpu, mp, cpu, in mmap_per_cpu()
612 if (nr_mmaps != evlist->nr_mmaps) in mmap_per_cpu()
613 pr_err("Miscounted nr_mmaps %d vs %d\n", nr_mmaps, evlist->nr_mmaps); in mmap_per_cpu()
618 perf_evlist__munmap(evlist); in mmap_per_cpu()
622 static int perf_evlist__nr_mmaps(struct perf_evlist *evlist) in perf_evlist__nr_mmaps() argument
627 nr_mmaps = perf_cpu_map__nr(evlist->all_cpus); in perf_evlist__nr_mmaps()
628 if (perf_cpu_map__has_any_cpu_or_is_empty(evlist->all_cpus)) { in perf_evlist__nr_mmaps()
630 nr_mmaps += perf_thread_map__nr(evlist->threads); in perf_evlist__nr_mmaps()
638 int perf_evlist__mmap_ops(struct perf_evlist *evlist, in perf_evlist__mmap_ops() argument
642 const struct perf_cpu_map *cpus = evlist->all_cpus; in perf_evlist__mmap_ops()
648 mp->mask = evlist->mmap_len - page_size - 1; in perf_evlist__mmap_ops()
650 evlist->nr_mmaps = perf_evlist__nr_mmaps(evlist); in perf_evlist__mmap_ops()
652 perf_evlist__for_each_entry(evlist, evsel) { in perf_evlist__mmap_ops()
659 if (evlist->pollfd.entries == NULL && perf_evlist__alloc_pollfd(evlist) < 0) in perf_evlist__mmap_ops()
663 return mmap_per_thread(evlist, ops, mp); in perf_evlist__mmap_ops()
665 return mmap_per_cpu(evlist, ops, mp); in perf_evlist__mmap_ops()
668 int perf_evlist__mmap(struct perf_evlist *evlist, int pages) in perf_evlist__mmap() argument
676 evlist->mmap_len = (pages + 1) * page_size; in perf_evlist__mmap()
678 return perf_evlist__mmap_ops(evlist, &ops, &mp); in perf_evlist__mmap()
681 void perf_evlist__munmap(struct perf_evlist *evlist) in perf_evlist__munmap() argument
685 if (evlist->mmap) { in perf_evlist__munmap()
686 for (i = 0; i < evlist->nr_mmaps; i++) in perf_evlist__munmap()
687 perf_mmap__munmap(&evlist->mmap[i]); in perf_evlist__munmap()
690 if (evlist->mmap_ovw) { in perf_evlist__munmap()
691 for (i = 0; i < evlist->nr_mmaps; i++) in perf_evlist__munmap()
692 perf_mmap__munmap(&evlist->mmap_ovw[i]); in perf_evlist__munmap()
695 zfree(&evlist->mmap); in perf_evlist__munmap()
696 zfree(&evlist->mmap_ovw); in perf_evlist__munmap()
700 perf_evlist__next_mmap(struct perf_evlist *evlist, struct perf_mmap *map, in perf_evlist__next_mmap() argument
706 return overwrite ? evlist->mmap_ovw_first : evlist->mmap_first; in perf_evlist__next_mmap()
721 void perf_evlist__set_leader(struct perf_evlist *evlist) in perf_evlist__set_leader() argument
723 if (evlist->nr_entries) { in perf_evlist__set_leader()
724 struct perf_evsel *first = list_entry(evlist->entries.next, in perf_evlist__set_leader()
727 __perf_evlist__set_leader(&evlist->entries, first); in perf_evlist__set_leader()
731 int perf_evlist__nr_groups(struct perf_evlist *evlist) in perf_evlist__nr_groups() argument
736 perf_evlist__for_each_evsel(evlist, evsel) { in perf_evlist__nr_groups()
748 void perf_evlist__go_system_wide(struct perf_evlist *evlist, struct perf_evsel *evsel) in perf_evlist__go_system_wide() argument
752 if (evlist->needs_map_propagation) in perf_evlist__go_system_wide()
753 __perf_evlist__propagate_maps(evlist, evsel); in perf_evlist__go_system_wide()