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
47 if (evlist->has_user_cpus && !evsel->system_wide) { in __perf_evlist__propagate_maps()
52 evsel->cpus = perf_cpu_map__get(evlist->user_requested_cpus); in __perf_evlist__propagate_maps()
74 if (evlist->has_user_cpus && !evsel->system_wide) { in __perf_evlist__propagate_maps()
75 assert(!perf_cpu_map__has_any_cpu(evlist->user_requested_cpus)); in __perf_evlist__propagate_maps()
76 if (!perf_cpu_map__equal(evsel->cpus, evlist->user_requested_cpus)) { in __perf_evlist__propagate_maps()
78 evsel->cpus = perf_cpu_map__get(evlist->user_requested_cpus); in __perf_evlist__propagate_maps()
99 perf_cpu_map__has_any_cpu(evlist->user_requested_cpus)) { in __perf_evlist__propagate_maps()
101 evsel->cpus = perf_cpu_map__get(evlist->user_requested_cpus); in __perf_evlist__propagate_maps()
112 struct perf_evsel *next = perf_evlist__next(evlist, evsel); in __perf_evlist__propagate_maps()
114 perf_evlist__remove(evlist, evsel); in __perf_evlist__propagate_maps()
117 list_for_each_entry_from(next, &evlist->entries, node) in __perf_evlist__propagate_maps()
128 evsel->threads = perf_thread_map__get(evlist->threads); in __perf_evlist__propagate_maps()
131 perf_cpu_map__merge(&evlist->all_cpus, evsel->cpus); in __perf_evlist__propagate_maps()
134 static void perf_evlist__propagate_maps(struct perf_evlist *evlist) in perf_evlist__propagate_maps() argument
138 evlist->needs_map_propagation = true; in perf_evlist__propagate_maps()
141 perf_cpu_map__put(evlist->all_cpus); in perf_evlist__propagate_maps()
142 evlist->all_cpus = NULL; in perf_evlist__propagate_maps()
144 list_for_each_entry_safe(evsel, n, &evlist->entries, node) in perf_evlist__propagate_maps()
145 __perf_evlist__propagate_maps(evlist, evsel); in perf_evlist__propagate_maps()
148 void perf_evlist__add(struct perf_evlist *evlist, in perf_evlist__add() argument
151 evsel->idx = evlist->nr_entries; in perf_evlist__add()
152 list_add_tail(&evsel->node, &evlist->entries); in perf_evlist__add()
153 evlist->nr_entries += 1; in perf_evlist__add()
155 if (evlist->needs_map_propagation) in perf_evlist__add()
156 __perf_evlist__propagate_maps(evlist, evsel); in perf_evlist__add()
159 void perf_evlist__remove(struct perf_evlist *evlist, in perf_evlist__remove() argument
163 evlist->nr_entries -= 1; in perf_evlist__remove()
168 struct perf_evlist *evlist = zalloc(sizeof(*evlist)); in perf_evlist__new() local
170 if (evlist != NULL) in perf_evlist__new()
171 perf_evlist__init(evlist); in perf_evlist__new()
173 return evlist; in perf_evlist__new()
177 perf_evlist__next(struct perf_evlist *evlist, struct perf_evsel *prev) in perf_evlist__next() argument
182 next = list_first_entry(&evlist->entries, in perf_evlist__next()
190 if (&next->node == &evlist->entries) in perf_evlist__next()
196 static void perf_evlist__purge(struct perf_evlist *evlist) in perf_evlist__purge() argument
200 perf_evlist__for_each_entry_safe(evlist, n, pos) { in perf_evlist__purge()
205 evlist->nr_entries = 0; in perf_evlist__purge()
208 void perf_evlist__exit(struct perf_evlist *evlist) in perf_evlist__exit() argument
210 perf_cpu_map__put(evlist->user_requested_cpus); in perf_evlist__exit()
211 perf_cpu_map__put(evlist->all_cpus); in perf_evlist__exit()
212 perf_thread_map__put(evlist->threads); in perf_evlist__exit()
213 evlist->user_requested_cpus = NULL; in perf_evlist__exit()
214 evlist->all_cpus = NULL; in perf_evlist__exit()
215 evlist->threads = NULL; in perf_evlist__exit()
216 fdarray__exit(&evlist->pollfd); in perf_evlist__exit()
219 void perf_evlist__delete(struct perf_evlist *evlist) in perf_evlist__delete() argument
221 if (evlist == NULL) in perf_evlist__delete()
224 perf_evlist__munmap(evlist); in perf_evlist__delete()
225 perf_evlist__close(evlist); in perf_evlist__delete()
226 perf_evlist__purge(evlist); in perf_evlist__delete()
227 perf_evlist__exit(evlist); in perf_evlist__delete()
228 free(evlist); in perf_evlist__delete()
231 void perf_evlist__set_maps(struct perf_evlist *evlist, in perf_evlist__set_maps() argument
242 if (cpus != evlist->user_requested_cpus) { in perf_evlist__set_maps()
243 perf_cpu_map__put(evlist->user_requested_cpus); in perf_evlist__set_maps()
244 evlist->user_requested_cpus = perf_cpu_map__get(cpus); in perf_evlist__set_maps()
247 if (threads != evlist->threads) { in perf_evlist__set_maps()
248 perf_thread_map__put(evlist->threads); in perf_evlist__set_maps()
249 evlist->threads = perf_thread_map__get(threads); in perf_evlist__set_maps()
252 perf_evlist__propagate_maps(evlist); in perf_evlist__set_maps()
255 int perf_evlist__open(struct perf_evlist *evlist) in perf_evlist__open() argument
260 perf_evlist__for_each_entry(evlist, evsel) { in perf_evlist__open()
269 perf_evlist__close(evlist); in perf_evlist__open()
273 void perf_evlist__close(struct perf_evlist *evlist) in perf_evlist__close() argument
277 perf_evlist__for_each_entry_reverse(evlist, evsel) in perf_evlist__close()
281 void perf_evlist__enable(struct perf_evlist *evlist) in perf_evlist__enable() argument
285 perf_evlist__for_each_entry(evlist, evsel) in perf_evlist__enable()
289 void perf_evlist__disable(struct perf_evlist *evlist) in perf_evlist__disable() argument
293 perf_evlist__for_each_entry(evlist, evsel) in perf_evlist__disable()
297 u64 perf_evlist__read_format(struct perf_evlist *evlist) in perf_evlist__read_format() argument
299 struct perf_evsel *first = perf_evlist__first(evlist); in perf_evlist__read_format()
306 static void perf_evlist__id_hash(struct perf_evlist *evlist, in perf_evlist__id_hash() argument
316 hlist_add_head(&sid->node, &evlist->heads[hash]); in perf_evlist__id_hash()
319 void perf_evlist__reset_id_hash(struct perf_evlist *evlist) in perf_evlist__reset_id_hash() argument
324 INIT_HLIST_HEAD(&evlist->heads[i]); in perf_evlist__reset_id_hash()
327 void perf_evlist__id_add(struct perf_evlist *evlist, in perf_evlist__id_add() argument
334 perf_evlist__id_hash(evlist, evsel, cpu_map_idx, thread, id); in perf_evlist__id_add()
338 int perf_evlist__id_add_fd(struct perf_evlist *evlist, in perf_evlist__id_add_fd() argument
363 if (perf_evlist__read_format(evlist) & PERF_FORMAT_GROUP) in perf_evlist__id_add_fd()
378 perf_evlist__id_add(evlist, evsel, cpu_map_idx, thread, id); in perf_evlist__id_add_fd()
382 int perf_evlist__alloc_pollfd(struct perf_evlist *evlist) in perf_evlist__alloc_pollfd() argument
384 int nr_cpus = perf_cpu_map__nr(evlist->all_cpus); in perf_evlist__alloc_pollfd()
385 int nr_threads = perf_thread_map__nr(evlist->threads); in perf_evlist__alloc_pollfd()
389 perf_evlist__for_each_entry(evlist, evsel) { in perf_evlist__alloc_pollfd()
396 if (fdarray__available_entries(&evlist->pollfd) < nfds && in perf_evlist__alloc_pollfd()
397 fdarray__grow(&evlist->pollfd, nfds) < 0) in perf_evlist__alloc_pollfd()
403 int perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd, in perf_evlist__add_pollfd() argument
406 int pos = fdarray__add(&evlist->pollfd, fd, revent | POLLERR | POLLHUP, flags); in perf_evlist__add_pollfd()
409 evlist->pollfd.priv[pos].ptr = ptr; in perf_evlist__add_pollfd()
425 int perf_evlist__filter_pollfd(struct perf_evlist *evlist, short revents_and_mask) in perf_evlist__filter_pollfd() argument
427 return fdarray__filter(&evlist->pollfd, revents_and_mask, in perf_evlist__filter_pollfd()
431 int perf_evlist__poll(struct perf_evlist *evlist, int timeout) in perf_evlist__poll() argument
433 return fdarray__poll(&evlist->pollfd, timeout); in perf_evlist__poll()
436 static struct perf_mmap* perf_evlist__alloc_mmap(struct perf_evlist *evlist, bool overwrite) in perf_evlist__alloc_mmap() argument
441 map = zalloc(evlist->nr_mmaps * sizeof(struct perf_mmap)); in perf_evlist__alloc_mmap()
445 for (i = 0; i < evlist->nr_mmaps; i++) { in perf_evlist__alloc_mmap()
473 perf_evlist__mmap_cb_get(struct perf_evlist *evlist, bool overwrite, int idx) in perf_evlist__mmap_cb_get() argument
477 maps = overwrite ? evlist->mmap_ovw : evlist->mmap; in perf_evlist__mmap_cb_get()
480 maps = perf_evlist__alloc_mmap(evlist, overwrite); in perf_evlist__mmap_cb_get()
485 evlist->mmap_ovw = maps; in perf_evlist__mmap_cb_get()
487 evlist->mmap = maps; in perf_evlist__mmap_cb_get()
502 static void perf_evlist__set_mmap_first(struct perf_evlist *evlist, struct perf_mmap *map, in perf_evlist__set_mmap_first() argument
506 evlist->mmap_ovw_first = map; in perf_evlist__set_mmap_first()
508 evlist->mmap_first = map; in perf_evlist__set_mmap_first()
512 mmap_per_evsel(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops, in mmap_per_evsel() argument
516 struct perf_cpu evlist_cpu = perf_cpu_map__cpu(evlist->all_cpus, cpu_idx); in mmap_per_evsel()
520 perf_evlist__for_each_entry(evlist, evsel) { in mmap_per_evsel()
533 map = ops->get(evlist, overwrite, idx); in mmap_per_evsel()
566 ops->idx(evlist, evsel, mp, idx); in mmap_per_evsel()
576 perf_evlist__set_mmap_first(evlist, map, overwrite); in mmap_per_evsel()
589 if (perf_evlist__add_pollfd(evlist, fd, map, revent, flgs) < 0) { in mmap_per_evsel()
595 if (perf_evlist__id_add_fd(evlist, evsel, cpu, thread, in mmap_per_evsel()
606 mmap_per_thread(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops, in mmap_per_thread() argument
609 int nr_threads = perf_thread_map__nr(evlist->threads); in mmap_per_thread()
610 int nr_cpus = perf_cpu_map__nr(evlist->all_cpus); in mmap_per_thread()
622 if (mmap_per_evsel(evlist, ops, idx, mp, 0, thread, &output, in mmap_per_thread()
632 if (mmap_per_evsel(evlist, ops, idx, mp, cpu, 0, &output, in mmap_per_thread()
637 if (nr_mmaps != evlist->nr_mmaps) in mmap_per_thread()
638 pr_err("Miscounted nr_mmaps %d vs %d\n", nr_mmaps, evlist->nr_mmaps); in mmap_per_thread()
643 perf_evlist__munmap(evlist); in mmap_per_thread()
648 mmap_per_cpu(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops, in mmap_per_cpu() argument
651 int nr_threads = perf_thread_map__nr(evlist->threads); in mmap_per_cpu()
652 int nr_cpus = perf_cpu_map__nr(evlist->all_cpus); in mmap_per_cpu()
663 if (mmap_per_evsel(evlist, ops, cpu, mp, cpu, in mmap_per_cpu()
669 if (nr_mmaps != evlist->nr_mmaps) in mmap_per_cpu()
670 pr_err("Miscounted nr_mmaps %d vs %d\n", nr_mmaps, evlist->nr_mmaps); in mmap_per_cpu()
675 perf_evlist__munmap(evlist); in mmap_per_cpu()
679 static int perf_evlist__nr_mmaps(struct perf_evlist *evlist) in perf_evlist__nr_mmaps() argument
684 nr_mmaps = perf_cpu_map__nr(evlist->all_cpus); in perf_evlist__nr_mmaps()
685 if (perf_cpu_map__has_any_cpu_or_is_empty(evlist->all_cpus)) { in perf_evlist__nr_mmaps()
687 nr_mmaps += perf_thread_map__nr(evlist->threads); in perf_evlist__nr_mmaps()
695 int perf_evlist__mmap_ops(struct perf_evlist *evlist, in perf_evlist__mmap_ops() argument
699 const struct perf_cpu_map *cpus = evlist->all_cpus; in perf_evlist__mmap_ops()
705 mp->mask = evlist->mmap_len - page_size - 1; in perf_evlist__mmap_ops()
707 evlist->nr_mmaps = perf_evlist__nr_mmaps(evlist); in perf_evlist__mmap_ops()
709 perf_evlist__for_each_entry(evlist, evsel) { in perf_evlist__mmap_ops()
716 if (evlist->pollfd.entries == NULL && perf_evlist__alloc_pollfd(evlist) < 0) in perf_evlist__mmap_ops()
720 return mmap_per_thread(evlist, ops, mp); in perf_evlist__mmap_ops()
722 return mmap_per_cpu(evlist, ops, mp); in perf_evlist__mmap_ops()
725 int perf_evlist__mmap(struct perf_evlist *evlist, int pages) in perf_evlist__mmap() argument
733 evlist->mmap_len = (pages + 1) * page_size; in perf_evlist__mmap()
735 return perf_evlist__mmap_ops(evlist, &ops, &mp); in perf_evlist__mmap()
738 void perf_evlist__munmap(struct perf_evlist *evlist) in perf_evlist__munmap() argument
742 if (evlist->mmap) { in perf_evlist__munmap()
743 for (i = 0; i < evlist->nr_mmaps; i++) in perf_evlist__munmap()
744 perf_mmap__munmap(&evlist->mmap[i]); in perf_evlist__munmap()
747 if (evlist->mmap_ovw) { in perf_evlist__munmap()
748 for (i = 0; i < evlist->nr_mmaps; i++) in perf_evlist__munmap()
749 perf_mmap__munmap(&evlist->mmap_ovw[i]); in perf_evlist__munmap()
752 zfree(&evlist->mmap); in perf_evlist__munmap()
753 zfree(&evlist->mmap_ovw); in perf_evlist__munmap()
757 perf_evlist__next_mmap(struct perf_evlist *evlist, struct perf_mmap *map, in perf_evlist__next_mmap() argument
763 return overwrite ? evlist->mmap_ovw_first : evlist->mmap_first; in perf_evlist__next_mmap()
778 void perf_evlist__set_leader(struct perf_evlist *evlist) in perf_evlist__set_leader() argument
780 if (evlist->nr_entries) { in perf_evlist__set_leader()
781 struct perf_evsel *first = list_entry(evlist->entries.next, in perf_evlist__set_leader()
784 __perf_evlist__set_leader(&evlist->entries, first); in perf_evlist__set_leader()
788 int perf_evlist__nr_groups(struct perf_evlist *evlist) in perf_evlist__nr_groups() argument
793 perf_evlist__for_each_evsel(evlist, evsel) { in perf_evlist__nr_groups()
805 void perf_evlist__go_system_wide(struct perf_evlist *evlist, struct perf_evsel *evsel) in perf_evlist__go_system_wide() argument
809 if (evlist->needs_map_propagation) in perf_evlist__go_system_wide()
810 __perf_evlist__propagate_maps(evlist, evsel); in perf_evlist__go_system_wide()