Lines Matching +full:cpu +full:- +full:map
1 // SPDX-License-Identifier: GPL-2.0
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()
39 if (evsel->system_wide) { in __perf_evlist__propagate_maps()
40 /* System wide: set the cpu map of the evsel to all online CPUs. */ in __perf_evlist__propagate_maps()
41 perf_cpu_map__put(evsel->cpus); in __perf_evlist__propagate_maps()
42 evsel->cpus = perf_cpu_map__new_online_cpus(); in __perf_evlist__propagate_maps()
43 } else if (evlist->has_user_cpus && evsel->is_pmu_core) { in __perf_evlist__propagate_maps()
48 perf_cpu_map__put(evsel->cpus); 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()
53 * The PMU didn't specify a default cpu map, this isn't a core in __perf_evlist__propagate_maps()
55 * requested CPUs have the "any CPU" (aka dummy) CPU value. In in __perf_evlist__propagate_maps()
59 perf_cpu_map__put(evsel->cpus); in __perf_evlist__propagate_maps()
60 evsel->cpus = perf_cpu_map__get(evlist->user_requested_cpus); in __perf_evlist__propagate_maps()
61 } else if (evsel->cpus != evsel->own_cpus) { in __perf_evlist__propagate_maps()
63 * No user requested cpu map but the PMU cpu map doesn't match in __perf_evlist__propagate_maps()
64 * the evsel's. Reset it back to the PMU cpu map. in __perf_evlist__propagate_maps()
66 perf_cpu_map__put(evsel->cpus); in __perf_evlist__propagate_maps()
67 evsel->cpus = perf_cpu_map__get(evsel->own_cpus); in __perf_evlist__propagate_maps()
70 if (evsel->system_wide) { in __perf_evlist__propagate_maps()
71 perf_thread_map__put(evsel->threads); in __perf_evlist__propagate_maps()
72 evsel->threads = perf_thread_map__new_dummy(); in __perf_evlist__propagate_maps()
74 perf_thread_map__put(evsel->threads); 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()
85 evlist->needs_map_propagation = true; in perf_evlist__propagate_maps()
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()
105 list_del_init(&evsel->node); in perf_evlist__remove()
106 evlist->nr_entries -= 1; in perf_evlist__remove()
125 next = list_first_entry(&evlist->entries, in perf_evlist__next()
133 if (&next->node == &evlist->entries) in perf_evlist__next()
144 list_del_init(&pos->node); in perf_evlist__purge()
148 evlist->nr_entries = 0; in perf_evlist__purge()
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()
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()
204 err = perf_evsel__open(evsel, evsel->cpus, evsel->threads); in perf_evlist__open()
244 return first->attr.read_format; in perf_evlist__read_format()
247 #define SID(e, x, y) xyarray__entry(e->sample_id, x, y)
251 int cpu, int thread, u64 id) in perf_evlist__id_hash() argument
254 struct perf_sample_id *sid = SID(evsel, cpu, thread); in perf_evlist__id_hash()
256 sid->id = id; in perf_evlist__id_hash()
257 sid->evsel = evsel; in perf_evlist__id_hash()
258 hash = hash_64(sid->id, PERF_EVLIST__HLIST_BITS); in perf_evlist__id_hash()
259 hlist_add_head(&sid->node, &evlist->heads[hash]); in perf_evlist__id_hash()
267 INIT_HLIST_HEAD(&evlist->heads[i]); in perf_evlist__reset_id_hash()
272 int cpu, int thread, u64 id) in perf_evlist__id_add() argument
274 perf_evlist__id_hash(evlist, evsel, cpu, thread, id); in perf_evlist__id_add()
275 evsel->id[evsel->ids++] = id; in perf_evlist__id_add()
280 int cpu, int thread, int fd) in perf_evlist__id_add_fd() argument
292 return -1; in perf_evlist__id_add_fd()
301 return -1; in perf_evlist__id_add_fd()
303 if (!(evsel->attr.read_format & PERF_FORMAT_ID) || in perf_evlist__id_add_fd()
304 read(fd, &read_data, sizeof(read_data)) == -1) in perf_evlist__id_add_fd()
305 return -1; in perf_evlist__id_add_fd()
307 if (evsel->attr.read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) in perf_evlist__id_add_fd()
309 if (evsel->attr.read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) in perf_evlist__id_add_fd()
315 perf_evlist__id_add(evlist, evsel, cpu, thread, id); in perf_evlist__id_add_fd()
321 int nr_cpus = perf_cpu_map__nr(evlist->all_cpus); in perf_evlist__alloc_pollfd()
322 int nr_threads = perf_thread_map__nr(evlist->threads); in perf_evlist__alloc_pollfd()
327 if (evsel->system_wide) in perf_evlist__alloc_pollfd()
333 if (fdarray__available_entries(&evlist->pollfd) < nfds && in perf_evlist__alloc_pollfd()
334 fdarray__grow(&evlist->pollfd, nfds) < 0) in perf_evlist__alloc_pollfd()
335 return -ENOMEM; in perf_evlist__alloc_pollfd()
343 int pos = fdarray__add(&evlist->pollfd, fd, revent | POLLERR | POLLHUP, flags); in perf_evlist__add_pollfd()
346 evlist->pollfd.priv[pos].ptr = ptr; in perf_evlist__add_pollfd()
356 struct perf_mmap *map = fda->priv[fd].ptr; in perf_evlist__munmap_filtered() local
358 if (map) in perf_evlist__munmap_filtered()
359 perf_mmap__put(map); in perf_evlist__munmap_filtered()
364 return fdarray__filter(&evlist->pollfd, revents_and_mask, in perf_evlist__filter_pollfd()
370 return fdarray__poll(&evlist->pollfd, timeout); in perf_evlist__poll()
376 struct perf_mmap *map; in perf_evlist__alloc_mmap() local
378 map = zalloc(evlist->nr_mmaps * sizeof(struct perf_mmap)); in perf_evlist__alloc_mmap()
379 if (!map) in perf_evlist__alloc_mmap()
382 for (i = 0; i < evlist->nr_mmaps; i++) { in perf_evlist__alloc_mmap()
383 struct perf_mmap *prev = i ? &map[i - 1] : NULL; in perf_evlist__alloc_mmap()
394 perf_mmap__init(&map[i], prev, overwrite, NULL); in perf_evlist__alloc_mmap()
397 return map; in perf_evlist__alloc_mmap()
400 static void perf_evsel__set_sid_idx(struct perf_evsel *evsel, int idx, int cpu, int thread) in perf_evsel__set_sid_idx() argument
402 struct perf_sample_id *sid = SID(evsel, cpu, thread); in perf_evsel__set_sid_idx()
404 sid->idx = idx; in perf_evsel__set_sid_idx()
405 sid->cpu = perf_cpu_map__cpu(evsel->cpus, cpu); in perf_evsel__set_sid_idx()
406 sid->tid = perf_thread_map__pid(evsel->threads, thread); in perf_evsel__set_sid_idx()
414 maps = overwrite ? evlist->mmap_ovw : evlist->mmap; in perf_evlist__mmap_cb_get()
422 evlist->mmap_ovw = maps; in perf_evlist__mmap_cb_get()
424 evlist->mmap = maps; in perf_evlist__mmap_cb_get()
430 #define FD(e, x, y) (*(int *) xyarray__entry(e->fd, x, y))
433 perf_evlist__mmap_cb_mmap(struct perf_mmap *map, struct perf_mmap_param *mp, in perf_evlist__mmap_cb_mmap() argument
434 int output, struct perf_cpu cpu) in perf_evlist__mmap_cb_mmap() argument
436 return perf_mmap__mmap(map, mp, output, cpu); in perf_evlist__mmap_cb_mmap()
439 static void perf_evlist__set_mmap_first(struct perf_evlist *evlist, struct perf_mmap *map, in perf_evlist__set_mmap_first() argument
443 evlist->mmap_ovw_first = map; in perf_evlist__set_mmap_first()
445 evlist->mmap_first = map; in perf_evlist__set_mmap_first()
453 struct perf_cpu evlist_cpu = perf_cpu_map__cpu(evlist->all_cpus, cpu_idx); in mmap_per_evsel()
458 bool overwrite = evsel->attr.write_backward; in mmap_per_evsel()
460 struct perf_mmap *map; in mmap_per_evsel() local
461 int *output, fd, cpu; in mmap_per_evsel() local
463 if (evsel->system_wide && thread) in mmap_per_evsel()
466 cpu = perf_cpu_map__idx(evsel->cpus, evlist_cpu); in mmap_per_evsel()
467 if (cpu == -1) in mmap_per_evsel()
470 map = ops->get(evlist, overwrite, idx); in mmap_per_evsel()
471 if (map == NULL) in mmap_per_evsel()
472 return -ENOMEM; in mmap_per_evsel()
475 mp->prot = PROT_READ; in mmap_per_evsel()
478 mp->prot = PROT_READ | PROT_WRITE; in mmap_per_evsel()
482 fd = FD(evsel, cpu, thread); in mmap_per_evsel()
484 if (*output == -1) { in mmap_per_evsel()
500 refcount_set(&map->refcnt, 2); in mmap_per_evsel()
502 if (ops->idx) in mmap_per_evsel()
503 ops->idx(evlist, evsel, mp, idx); in mmap_per_evsel()
507 if (ops->mmap(map, mp, *output, evlist_cpu) < 0) in mmap_per_evsel()
508 return -1; in mmap_per_evsel()
513 perf_evlist__set_mmap_first(evlist, map, overwrite); in mmap_per_evsel()
516 pr_debug("idx %d: set output fd %d -> %d\n", idx, fd, *output); in mmap_per_evsel()
518 return -1; in mmap_per_evsel()
520 perf_mmap__get(map); in mmap_per_evsel()
525 flgs = evsel->system_wide ? fdarray_flag__nonfilterable : fdarray_flag__default; in mmap_per_evsel()
526 if (perf_evlist__add_pollfd(evlist, fd, map, revent, flgs) < 0) { in mmap_per_evsel()
527 perf_mmap__put(map); in mmap_per_evsel()
528 return -1; in mmap_per_evsel()
531 if (evsel->attr.read_format & PERF_FORMAT_ID) { in mmap_per_evsel()
532 if (perf_evlist__id_add_fd(evlist, evsel, cpu, thread, in mmap_per_evsel()
534 return -1; in mmap_per_evsel()
535 perf_evsel__set_sid_idx(evsel, idx, cpu, thread); in mmap_per_evsel()
546 int nr_threads = perf_thread_map__nr(evlist->threads); in mmap_per_thread()
547 int nr_cpus = perf_cpu_map__nr(evlist->all_cpus); in mmap_per_thread()
548 int cpu, thread, idx = 0; in mmap_per_thread() local
551 pr_debug("%s: nr cpu values (may include -1) %d nr threads %d\n", in mmap_per_thread()
554 /* per-thread mmaps */ in mmap_per_thread()
556 int output = -1; in mmap_per_thread()
557 int output_overwrite = -1; in mmap_per_thread()
564 /* system-wide mmaps i.e. per-cpu */ in mmap_per_thread()
565 for (cpu = 1; cpu < nr_cpus; cpu++, idx++) { in mmap_per_thread()
566 int output = -1; in mmap_per_thread()
567 int output_overwrite = -1; in mmap_per_thread()
569 if (mmap_per_evsel(evlist, ops, idx, mp, cpu, 0, &output, in mmap_per_thread()
574 if (nr_mmaps != evlist->nr_mmaps) in mmap_per_thread()
575 pr_err("Miscounted nr_mmaps %d vs %d\n", nr_mmaps, evlist->nr_mmaps); in mmap_per_thread()
581 return -1; in mmap_per_thread()
588 int nr_threads = perf_thread_map__nr(evlist->threads); in mmap_per_cpu()
589 int nr_cpus = perf_cpu_map__nr(evlist->all_cpus); in mmap_per_cpu()
591 int cpu, thread; in mmap_per_cpu() local
593 pr_debug("%s: nr cpu values %d nr threads %d\n", __func__, nr_cpus, nr_threads); in mmap_per_cpu()
595 for (cpu = 0; cpu < nr_cpus; cpu++) { in mmap_per_cpu()
596 int output = -1; in mmap_per_cpu()
597 int output_overwrite = -1; in mmap_per_cpu()
600 if (mmap_per_evsel(evlist, ops, cpu, mp, cpu, in mmap_per_cpu()
606 if (nr_mmaps != evlist->nr_mmaps) in mmap_per_cpu()
607 pr_err("Miscounted nr_mmaps %d vs %d\n", nr_mmaps, evlist->nr_mmaps); in mmap_per_cpu()
613 return -1; in mmap_per_cpu()
620 /* One for each CPU */ in perf_evlist__nr_mmaps()
621 nr_mmaps = perf_cpu_map__nr(evlist->all_cpus); in perf_evlist__nr_mmaps()
622 if (perf_cpu_map__has_any_cpu_or_is_empty(evlist->all_cpus)) { in perf_evlist__nr_mmaps()
624 nr_mmaps += perf_thread_map__nr(evlist->threads); in perf_evlist__nr_mmaps()
625 /* Minus the per-thread CPU (-1) */ in perf_evlist__nr_mmaps()
626 nr_mmaps -= 1; in perf_evlist__nr_mmaps()
636 const struct perf_cpu_map *cpus = evlist->all_cpus; in perf_evlist__mmap_ops()
639 if (!ops || !ops->get || !ops->mmap) in perf_evlist__mmap_ops()
640 return -EINVAL; in perf_evlist__mmap_ops()
642 mp->mask = evlist->mmap_len - page_size - 1; in perf_evlist__mmap_ops()
644 evlist->nr_mmaps = perf_evlist__nr_mmaps(evlist); in perf_evlist__mmap_ops()
647 if ((evsel->attr.read_format & PERF_FORMAT_ID) && in perf_evlist__mmap_ops()
648 evsel->sample_id == NULL && in perf_evlist__mmap_ops()
649 perf_evsel__alloc_id(evsel, evsel->fd->max_x, evsel->fd->max_y) < 0) in perf_evlist__mmap_ops()
650 return -ENOMEM; in perf_evlist__mmap_ops()
653 if (evlist->pollfd.entries == NULL && perf_evlist__alloc_pollfd(evlist) < 0) in perf_evlist__mmap_ops()
654 return -ENOMEM; in perf_evlist__mmap_ops()
670 evlist->mmap_len = (pages + 1) * page_size; in perf_evlist__mmap()
679 if (evlist->mmap) { in perf_evlist__munmap()
680 for (i = 0; i < evlist->nr_mmaps; i++) in perf_evlist__munmap()
681 perf_mmap__munmap(&evlist->mmap[i]); in perf_evlist__munmap()
684 if (evlist->mmap_ovw) { in perf_evlist__munmap()
685 for (i = 0; i < evlist->nr_mmaps; i++) in perf_evlist__munmap()
686 perf_mmap__munmap(&evlist->mmap_ovw[i]); in perf_evlist__munmap()
689 zfree(&evlist->mmap); in perf_evlist__munmap()
690 zfree(&evlist->mmap_ovw); in perf_evlist__munmap()
694 perf_evlist__next_mmap(struct perf_evlist *evlist, struct perf_mmap *map, in perf_evlist__next_mmap() argument
697 if (map) in perf_evlist__next_mmap()
698 return map->next; in perf_evlist__next_mmap()
700 return overwrite ? evlist->mmap_ovw_first : evlist->mmap_first; in perf_evlist__next_mmap()
709 evsel->leader = leader; in __perf_evlist__set_leader()
712 leader->nr_members = n; in __perf_evlist__set_leader()
717 if (evlist->nr_entries) { in perf_evlist__set_leader()
718 struct perf_evsel *first = list_entry(evlist->entries.next, in perf_evlist__set_leader()
721 __perf_evlist__set_leader(&evlist->entries, first); in perf_evlist__set_leader()
736 if (evsel->leader == evsel && evsel->nr_members > 1) in perf_evlist__nr_groups()
744 if (!evsel->system_wide) { in perf_evlist__go_system_wide()
745 evsel->system_wide = true; in perf_evlist__go_system_wide()
746 if (evlist->needs_map_propagation) in perf_evlist__go_system_wide()