Lines Matching +full:close +full:- +full:range

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Parts came from builtin-{top,stat,record}.c, see those files for further
26 #include "bpf-event.h"
33 #include "util/bpf-filter.h"
37 #include "util/intel-tpebs.h"
43 #include "parse-events.h"
44 #include <subcmd/parse-options.h>
71 #define FD(e, x, y) (*(int *)xyarray__entry(e->core.fd, x, y))
72 #define SID(e, x, y) xyarray__entry(e->core.sample_id, x, y)
77 perf_evlist__init(&evlist->core); in evlist__init()
78 perf_evlist__set_maps(&evlist->core, cpus, threads); in evlist__init()
79 evlist->workload.pid = -1; in evlist__init()
80 evlist->bkw_mmap_state = BKW_MMAP_NOTREADY; in evlist__init()
81 evlist->ctl_fd.fd = -1; in evlist__init()
82 evlist->ctl_fd.ack = -1; in evlist__init()
83 evlist->ctl_fd.pos = -1; in evlist__init()
84 evlist->nr_br_cntr = -1; in evlist__init()
113 if (evlist->core.nr_entries > 1) { in evlist__new_default()
136 * evlist__set_id_pos - set the positions of event ids.
146 evlist->id_pos = first->id_pos; in evlist__set_id_pos()
147 evlist->is_pos = first->is_pos; in evlist__set_id_pos()
165 list_del_init(&pos->core.node); in evlist__purge()
166 pos->evlist = NULL; in evlist__purge()
170 evlist->core.nr_entries = 0; in evlist__purge()
175 event_enable_timer__exit(&evlist->eet); in evlist__exit()
176 zfree(&evlist->mmap); in evlist__exit()
177 zfree(&evlist->overwrite_mmap); in evlist__exit()
178 perf_evlist__exit(&evlist->core); in evlist__exit()
197 perf_evlist__add(&evlist->core, &entry->core); in evlist__add()
198 entry->evlist = evlist; in evlist__add()
199 entry->tracking = !entry->core.idx; in evlist__add()
201 if (evlist->core.nr_entries == 1) in evlist__add()
207 evsel->evlist = NULL; in evlist__remove()
208 perf_evlist__remove(&evlist->core, &evsel->core); in evlist__remove()
217 list_del_init(&evsel->core.node); in evlist__splice_list_tail()
225 list_del_init(&evsel->core.node); in evlist__splice_list_tail()
244 err = -EEXIST; in __evlist__set_tracepoints_handlers()
245 if (evsel->handler != NULL) in __evlist__set_tracepoints_handlers()
247 evsel->handler = assocs[i].handler; in __evlist__set_tracepoints_handlers()
257 perf_evlist__set_leader(&evlist->core); in evlist__set_leader()
271 return evsel__new_idx(&attr, evlist->core.nr_entries); in evlist__dummy_event()
279 return -ENOMEM; in evlist__add_dummy()
292 evsel->core.attr.exclude_kernel = 1; in evlist__add_aux_dummy()
293 evsel->core.attr.exclude_guest = 1; in evlist__add_aux_dummy()
294 evsel->core.attr.exclude_hv = 1; in evlist__add_aux_dummy()
295 evsel->core.system_wide = system_wide; in evlist__add_aux_dummy()
296 evsel->no_aux_samples = true; in evlist__add_aux_dummy()
297 evsel->name = strdup("dummy:u"); in evlist__add_aux_dummy()
315 evsel->core.system_wide = system_wide; in evlist__add_sched_switch()
316 evsel->no_aux_samples = true; in evlist__add_sched_switch()
328 if ((evsel->core.attr.type == PERF_TYPE_TRACEPOINT) && in evlist__find_tracepoint_by_name()
329 (strcmp(evsel->name, name) == 0)) in evlist__find_tracepoint_by_name()
342 return -1; in evlist__add_newtp()
344 evsel->handler = handler; in evlist__add_newtp()
357 .evlist_cpu_map_nr = perf_cpu_map__nr(evlist->core.all_cpus), in evlist__cpu_begin()
358 .cpu = (struct perf_cpu){ .cpu = -1}, in evlist__cpu_begin()
368 itr.cpu = perf_cpu_map__cpu(evlist->core.all_cpus, 0); in evlist__cpu_begin()
370 itr.cpu_map_idx = perf_cpu_map__idx(itr.evsel->core.cpus, itr.cpu); in evlist__cpu_begin()
375 if (itr.cpu_map_idx == -1) in evlist__cpu_begin()
384 while (evlist_cpu_itr->evsel != evlist__last(evlist_cpu_itr->container)) { in evlist_cpu_iterator__next()
385 evlist_cpu_itr->evsel = evsel__next(evlist_cpu_itr->evsel); in evlist_cpu_iterator__next()
386 evlist_cpu_itr->cpu_map_idx = in evlist_cpu_iterator__next()
387 perf_cpu_map__idx(evlist_cpu_itr->evsel->core.cpus, in evlist_cpu_iterator__next()
388 evlist_cpu_itr->cpu); in evlist_cpu_iterator__next()
389 if (evlist_cpu_itr->cpu_map_idx != -1) in evlist_cpu_iterator__next()
392 evlist_cpu_itr->evlist_cpu_map_idx++; in evlist_cpu_iterator__next()
393 if (evlist_cpu_itr->evlist_cpu_map_idx < evlist_cpu_itr->evlist_cpu_map_nr) { in evlist_cpu_iterator__next()
394 evlist_cpu_itr->evsel = evlist__first(evlist_cpu_itr->container); in evlist_cpu_iterator__next()
395 evlist_cpu_itr->cpu = in evlist_cpu_iterator__next()
396 perf_cpu_map__cpu(evlist_cpu_itr->container->core.all_cpus, in evlist_cpu_iterator__next()
397 evlist_cpu_itr->evlist_cpu_map_idx); in evlist_cpu_iterator__next()
398 if (evlist_cpu_itr->affinity) in evlist_cpu_iterator__next()
399 affinity__set(evlist_cpu_itr->affinity, evlist_cpu_itr->cpu.cpu); in evlist_cpu_iterator__next()
400 evlist_cpu_itr->cpu_map_idx = in evlist_cpu_iterator__next()
401 perf_cpu_map__idx(evlist_cpu_itr->evsel->core.cpus, in evlist_cpu_iterator__next()
402 evlist_cpu_itr->cpu); in evlist_cpu_iterator__next()
407 if (evlist_cpu_itr->cpu_map_idx == -1) in evlist_cpu_iterator__next()
414 return evlist_cpu_itr->evlist_cpu_map_idx >= evlist_cpu_itr->evlist_cpu_map_nr; in evlist_cpu_iterator__end()
431 if (!evsel__is_group_leader(pos) || !pos->core.fd) in evlist__is_enabled()
434 if (!pos->disabled) in evlist__is_enabled()
448 if (!cpu_map__is_dummy(evlist->core.user_requested_cpus)) { in __evlist__disable()
460 if (pos->disabled || !evsel__is_group_leader(pos) || !pos->core.fd) in __evlist__disable()
464 if (pos->immediate) in __evlist__disable()
466 if (pos->immediate != imm) in __evlist__disable()
478 if (!evsel__is_group_leader(pos) || !pos->core.fd) in __evlist__disable()
482 pos->disabled = true; in __evlist__disable()
490 evlist->enabled = evlist__is_enabled(evlist); in __evlist__disable()
492 evlist->enabled = false; in __evlist__disable()
517 if (!cpu_map__is_dummy(evlist->core.user_requested_cpus)) { in __evlist__enable()
527 if (!evsel__is_group_leader(pos) || !pos->core.fd) in __evlist__enable()
537 if (!evsel__is_group_leader(pos) || !pos->core.fd) in __evlist__enable()
541 pos->disabled = false; in __evlist__enable()
549 evlist->enabled = true; in __evlist__enable()
569 (evlist->enabled ? evlist__disable : evlist__enable)(evlist); in evlist__toggle_enable()
574 return perf_evlist__add_pollfd(&evlist->core, fd, NULL, POLLIN, fdarray_flag__default); in evlist__add_pollfd()
579 return perf_evlist__filter_pollfd(&evlist->core, revents_and_mask); in evlist__filter_pollfd()
585 return perf_evlist__add_pollfd(&evlist->core, fd, NULL, POLLIN, in evlist__add_wakeup_eventfd()
593 return perf_evlist__poll(&evlist->core, timeout); in evlist__poll()
603 head = &evlist->core.heads[hash]; in evlist__id2sid()
606 if (sid->id == id) in evlist__id2sid()
616 if (evlist->core.nr_entries == 1 || !id) in evlist__id2evsel()
621 return container_of(sid->evsel, struct evsel, core); in evlist__id2evsel()
638 return container_of(sid->evsel, struct evsel, core); in evlist__id2evsel_strict()
645 const __u64 *array = event->sample.array; in evlist__event2id()
648 n = (event->header.size - sizeof(event->header)) >> 3; in evlist__event2id()
650 if (event->header.type == PERF_RECORD_SAMPLE) { in evlist__event2id()
651 if (evlist->id_pos >= n) in evlist__event2id()
652 return -1; in evlist__event2id()
653 *id = array[evlist->id_pos]; in evlist__event2id()
655 if (evlist->is_pos > n) in evlist__event2id()
656 return -1; in evlist__event2id()
657 n -= evlist->is_pos; in evlist__event2id()
671 if (evlist->core.nr_entries == 1) in evlist__event2evsel()
674 if (!first->core.attr.sample_id_all && in evlist__event2evsel()
675 event->header.type != PERF_RECORD_SAMPLE) in evlist__event2evsel()
686 head = &evlist->core.heads[hash]; in evlist__event2evsel()
689 if (sid->id == id) in evlist__event2evsel()
690 return container_of(sid->evsel, struct evsel, core); in evlist__event2evsel()
699 if (!evlist->overwrite_mmap) in evlist__set_paused()
702 for (i = 0; i < evlist->core.nr_mmaps; i++) { in evlist__set_paused()
703 int fd = evlist->overwrite_mmap[i].core.fd; in evlist__set_paused()
729 if (evlist->mmap) in evlist__munmap_nofree()
730 for (i = 0; i < evlist->core.nr_mmaps; i++) in evlist__munmap_nofree()
731 perf_mmap__munmap(&evlist->mmap[i].core); in evlist__munmap_nofree()
733 if (evlist->overwrite_mmap) in evlist__munmap_nofree()
734 for (i = 0; i < evlist->core.nr_mmaps; i++) in evlist__munmap_nofree()
735 perf_mmap__munmap(&evlist->overwrite_mmap[i].core); in evlist__munmap_nofree()
741 zfree(&evlist->mmap); in evlist__munmap()
742 zfree(&evlist->overwrite_mmap); in evlist__munmap()
758 map = zalloc(evlist->core.nr_mmaps * sizeof(struct mmap)); in evlist__alloc_mmap()
762 for (i = 0; i < evlist->core.nr_mmaps; i++) { in evlist__alloc_mmap()
763 struct perf_mmap *prev = i ? &map[i - 1].core : NULL; in evlist__alloc_mmap()
790 auxtrace_mmap_params__set_idx(&mp->auxtrace_mp, evlist, evsel, idx); in perf_evlist__mmap_cb_idx()
799 maps = overwrite ? evlist->overwrite_mmap : evlist->mmap; in perf_evlist__mmap_cb_get()
807 evlist->overwrite_mmap = maps; in perf_evlist__mmap_cb_get()
808 if (evlist->bkw_mmap_state == BKW_MMAP_NOTREADY) in perf_evlist__mmap_cb_get()
811 evlist->mmap = maps; in perf_evlist__mmap_cb_get()
841 max -= (page_size / 1024); in perf_event_mlock_kb_in_pages()
874 return -EINVAL; in parse_pages_arg()
877 if (val != (unsigned long) -1) { in parse_pages_arg()
885 return -EINVAL; in parse_pages_arg()
896 return -EINVAL; in parse_pages_arg()
904 return -EINVAL; in parse_pages_arg()
919 pr_err("Invalid argument for --mmap_pages/-m\n"); in __evlist__parse_mmap_pages()
920 return -1; in __evlist__parse_mmap_pages()
929 return __evlist__parse_mmap_pages(opt->value, str); in evlist__parse_mmap_pages()
933 * evlist__mmap_ex - Create mmaps to receive events.
937 * @auxtrace_pages - auxtrace map length in pages
938 * @auxtrace_overwrite - overwrite older auxtrace data?
971 evlist->core.mmap_len = evlist__mmap_size(pages); in evlist__mmap_ex()
972 pr_debug("mmap size %zuB\n", evlist->core.mmap_len); in evlist__mmap_ex()
974 auxtrace_mmap_params__init(&mp.auxtrace_mp, evlist->core.mmap_len, in evlist__mmap_ex()
977 return perf_evlist__mmap_ops(&evlist->core, &ops, &mp.core); in evlist__mmap_ex()
987 bool all_threads = (target->per_thread && target->system_wide); in evlist__create_maps()
992 * If specify '-a' and '--per-thread' to perf record, perf record in evlist__create_maps()
993 * will override '--per-thread'. target->per_thread = false and in evlist__create_maps()
994 * target->system_wide = true. in evlist__create_maps()
996 * If specify '--per-thread' only to perf record, in evlist__create_maps()
997 * target->per_thread = true and target->system_wide = false. in evlist__create_maps()
999 * So target->per_thread && target->system_wide is false. in evlist__create_maps()
1004 * For perf stat, it allows the case that target->per_thread and in evlist__create_maps()
1005 * target->system_wide are all true. It means to collect system-wide in evlist__create_maps()
1006 * per-thread data. thread_map__new_str will call in evlist__create_maps()
1009 threads = thread_map__new_str(target->pid, target->tid, target->uid, in evlist__create_maps()
1013 return -1; in evlist__create_maps()
1018 cpus = perf_cpu_map__new(target->cpu_list); in evlist__create_maps()
1023 evlist->core.has_user_cpus = !!target->cpu_list; in evlist__create_maps()
1025 perf_evlist__set_maps(&evlist->core, cpus, threads); in evlist__create_maps()
1035 return -1; in evlist__create_maps()
1049 if (evsel->filter) { in evlist__apply_filters()
1050 err = perf_evsel__apply_filter(&evsel->core, evsel->filter); in evlist__apply_filters()
1058 * non-tracepoint events can have BPF filters. in evlist__apply_filters()
1060 if (!list_empty(&evsel->bpf_filters)) { in evlist__apply_filters()
1078 return -1; in evlist__set_tp_filter()
1081 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) in evlist__set_tp_filter()
1098 return -1; in evlist__append_tp_filter()
1101 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) in evlist__append_tp_filter()
1165 if (evlist->core.nr_entries == 1) in evlist__valid_sample_type()
1168 if (evlist->id_pos < 0 || evlist->is_pos < 0) in evlist__valid_sample_type()
1172 if (pos->id_pos != evlist->id_pos || in evlist__valid_sample_type()
1173 pos->is_pos != evlist->is_pos) in evlist__valid_sample_type()
1184 if (evlist->combined_sample_type) in __evlist__combined_sample_type()
1185 return evlist->combined_sample_type; in __evlist__combined_sample_type()
1188 evlist->combined_sample_type |= evsel->core.attr.sample_type; in __evlist__combined_sample_type()
1190 return evlist->combined_sample_type; in __evlist__combined_sample_type()
1195 evlist->combined_sample_type = 0; in evlist__combined_sample_type()
1205 branch_type |= evsel->core.attr.branch_sample_type; in evlist__combined_branch_type()
1217 if ((pos->core.attr.branch_sample_type & PERF_SAMPLE_BRANCH_COUNTERS) && in evlist__find_dup_event_from_prev()
1218 !strcmp(pos->name, event->name)) in evlist__find_dup_event_from_prev()
1248 name[1] = '0' + i - 1; in evlist__new_abbr_name()
1261 if (evsel->core.attr.branch_sample_type & PERF_SAMPLE_BRANCH_COUNTERS) { in evlist__update_br_cntr()
1262 evsel->br_cntr_idx = i++; in evlist__update_br_cntr()
1263 evsel__leader(evsel)->br_cntr_nr++; in evlist__update_br_cntr()
1267 memcpy(evsel->abbr_name, dup->abbr_name, 3 * sizeof(char)); in evlist__update_br_cntr()
1269 evlist__new_abbr_name(evsel->abbr_name); in evlist__update_br_cntr()
1272 evlist->nr_br_cntr = i; in evlist__update_br_cntr()
1278 u64 read_format = first->core.attr.read_format; in evlist__valid_read_format()
1279 u64 sample_type = first->core.attr.sample_type; in evlist__valid_read_format()
1282 if (read_format != pos->core.attr.read_format) { in evlist__valid_read_format()
1284 read_format, (u64)pos->core.attr.read_format); in evlist__valid_read_format()
1301 return first->core.attr.sample_id_all ? evsel__id_hdr_size(first) : 0; in evlist__id_hdr_size()
1309 if (first->core.attr.sample_id_all != pos->core.attr.sample_id_all) in evlist__valid_sample_id_all()
1319 return first->core.attr.sample_id_all; in evlist__sample_id_all()
1324 evlist->selected = evsel; in evlist__set_selected()
1337 if (!evlist->core.user_requested_cpus || in evlist__close()
1338 cpu_map__is_dummy(evlist->core.user_requested_cpus)) { in evlist__close()
1348 perf_evsel__close_cpu(&evlist_cpu_itr.evsel->core, in evlist__close()
1354 perf_evsel__free_fd(&evsel->core); in evlist__close()
1355 perf_evsel__free_id(&evsel->core); in evlist__close()
1357 perf_evlist__reset_id_hash(&evlist->core); in evlist__close()
1369 * FIXME: -ENOMEM is the best we can do here, the cpu_map in evlist__create_syswide_maps()
1372 * default cpu identity map :-\ in evlist__create_syswide_maps()
1376 return -ENOMEM; in evlist__create_syswide_maps()
1381 return -ENOMEM; in evlist__create_syswide_maps()
1384 perf_evlist__set_maps(&evlist->core, cpus, threads); in evlist__create_syswide_maps()
1397 * as sys_perf_event_open(cpu = -1, thread = -1) is EINVAL in evlist__open()
1399 if (evlist->core.threads == NULL && evlist->core.user_requested_cpus == NULL) { in evlist__open()
1408 err = evsel__open(evsel, evsel->core.cpus, evsel->core.threads); in evlist__open()
1416 errno = -err; in evlist__open()
1426 evlist->workload.cork_fd = -1; in evlist__prepare_workload()
1430 return -1; in evlist__prepare_workload()
1438 evlist->workload.pid = fork(); in evlist__prepare_workload()
1439 if (evlist->workload.pid < 0) { in evlist__prepare_workload()
1444 if (!evlist->workload.pid) { in evlist__prepare_workload()
1452 close(child_ready_pipe[0]); in evlist__prepare_workload()
1453 close(go_pipe[1]); in evlist__prepare_workload()
1457 * Change the name of this process not to confuse --exclude-perf users in evlist__prepare_workload()
1461 prctl(PR_SET_NAME, "perf-exec"); in evlist__prepare_workload()
1466 close(child_ready_pipe[1]); in evlist__prepare_workload()
1478 * the parent will just close workload.cork_fd, without writing in evlist__prepare_workload()
1483 if (ret == -1) in evlist__prepare_workload()
1498 exit(-1); in evlist__prepare_workload()
1510 if (evlist->core.threads == NULL) { in evlist__prepare_workload()
1511 fprintf(stderr, "FATAL: evlist->threads need to be set at this point (%s:%d).\n", in evlist__prepare_workload()
1515 perf_thread_map__set_pid(evlist->core.threads, 0, evlist->workload.pid); in evlist__prepare_workload()
1518 close(child_ready_pipe[1]); in evlist__prepare_workload()
1519 close(go_pipe[0]); in evlist__prepare_workload()
1523 if (read(child_ready_pipe[0], &bf, 1) == -1) { in evlist__prepare_workload()
1529 evlist->workload.cork_fd = go_pipe[1]; in evlist__prepare_workload()
1530 close(child_ready_pipe[0]); in evlist__prepare_workload()
1534 close(go_pipe[0]); in evlist__prepare_workload()
1535 close(go_pipe[1]); in evlist__prepare_workload()
1537 close(child_ready_pipe[0]); in evlist__prepare_workload()
1538 close(child_ready_pipe[1]); in evlist__prepare_workload()
1539 return -1; in evlist__prepare_workload()
1544 if (evlist->workload.cork_fd >= 0) { in evlist__start_workload()
1550 ret = write(evlist->workload.cork_fd, &bf, 1); in evlist__start_workload()
1554 close(evlist->workload.cork_fd); in evlist__start_workload()
1555 evlist->workload.cork_fd = -1; in evlist__start_workload()
1566 if (evlist->workload.cork_fd >= 0) { in evlist__cancel_workload()
1567 close(evlist->workload.cork_fd); in evlist__cancel_workload()
1568 evlist->workload.cork_fd = -1; in evlist__cancel_workload()
1569 waitpid(evlist->workload.pid, &status, WNOHANG); in evlist__cancel_workload()
1579 return -EFAULT; in evlist__parse_sample()
1583 if (perf_guest && sample->id) { in evlist__parse_sample()
1584 struct perf_sample_id *sid = evlist__id2sid(evlist, sample->id); in evlist__parse_sample()
1587 sample->machine_pid = sid->machine_pid; in evlist__parse_sample()
1588 sample->vcpu = sid->vcpu.cpu; in evlist__parse_sample()
1599 return -EFAULT; in evlist__parse_sample_timestamp()
1617 printed += scnprintf(buf + printed, size - printed, "\nHint:\t"); in evlist__strerror_open()
1620 printed += scnprintf(buf + printed, size - printed, in evlist__strerror_open()
1623 printed += scnprintf(buf + printed, size - printed, in evlist__strerror_open()
1624 "For system wide tracing it needs to be set to -1.\n"); in evlist__strerror_open()
1626 printed += scnprintf(buf + printed, size - printed, in evlist__strerror_open()
1627 "Hint:\tTry: 'sudo sh -c \"echo -1 > /proc/sys/kernel/perf_event_paranoid\"'\n" in evlist__strerror_open()
1637 if (first->core.attr.sample_freq < (u64)max_freq) in evlist__strerror_open()
1644 emsg, max_freq, first->core.attr.sample_freq); in evlist__strerror_open()
1659 int pages_attempted = evlist->core.mmap_len / 1024, pages_max_per_user, printed = 0; in evlist__strerror_mmap()
1664 printed += scnprintf(buf + printed, size - printed, in evlist__strerror_mmap()
1671 printed += scnprintf(buf + printed, size - printed, in evlist__strerror_mmap()
1672 "Hint:\tTry 'sudo sh -c \"echo %d > /proc/sys/kernel/perf_event_mlock_kb\"', or\n", in evlist__strerror_mmap()
1676 printed += scnprintf(buf + printed, size - printed, in evlist__strerror_mmap()
1677 "Hint:\tTry using a smaller -m/--mmap-pages value."); in evlist__strerror_mmap()
1697 list_move_tail(&evsel->core.node, &move); in evlist__to_front()
1700 list_splice(&move, &evlist->core.entries); in evlist__to_front()
1708 if (evsel->tracking) in evlist__get_tracking_event()
1719 if (tracking_evsel->tracking) in evlist__set_tracking_event()
1724 evsel->tracking = false; in evlist__set_tracking_event()
1727 tracking_evsel->tracking = true; in evlist__set_tracking_event()
1742 perf_evlist__go_system_wide(&evlist->core, &evsel->core); in evlist__findnew_tracking_event()
1753 if (!evsel->name) in evlist__find_evsel_by_str()
1764 enum bkw_mmap_state old_state = evlist->bkw_mmap_state; in evlist__toggle_bkw_mmap()
1771 if (!evlist->overwrite_mmap) in evlist__toggle_bkw_mmap()
1801 evlist->bkw_mmap_state = state; in evlist__toggle_bkw_mmap()
1824 if (!evsel->core.attr.exclude_kernel) in evlist__exclude_kernel()
1842 leader->forced_leader = true; in evlist__force_leader()
1846 struct evsel *evlist__reset_weak_group(struct evlist *evsel_list, struct evsel *evsel, bool close) in evlist__reset_weak_group() argument
1854 leader->name, leader->core.nr_members); in evlist__reset_weak_group()
1864 if (is_open && close) in evlist__reset_weak_group()
1865 perf_evsel__close(&c2->core); in evlist__reset_weak_group()
1867 * We want to close all members of the group and reopen in evlist__reset_weak_group()
1877 c2->reset_group = true; in evlist__reset_weak_group()
1881 if (leader->core.nr_members == 1) in evlist__reset_weak_group()
1882 leader->core.nr_members = 0; in evlist__reset_weak_group()
1892 return -EINVAL; in evlist__parse_control_fifo()
1896 return -EINVAL; in evlist__parse_control_fifo()
1900 return -ENOMEM; in evlist__parse_control_fifo()
1913 ret = -errno; in evlist__parse_control_fifo()
1924 ret = -errno; in evlist__parse_control_fifo()
1946 return -EINVAL; in evlist__parse_control()
1951 return -EINVAL; in evlist__parse_control()
1955 return -EINVAL; in evlist__parse_control()
1965 close(ctl_fd); in evlist__close_control()
1967 close(ctl_fd_ack); in evlist__close_control()
1973 if (fd == -1) { in evlist__initialize_ctlfd()
1978 evlist->ctl_fd.pos = perf_evlist__add_pollfd(&evlist->core, fd, NULL, POLLIN, in evlist__initialize_ctlfd()
1981 if (evlist->ctl_fd.pos < 0) { in evlist__initialize_ctlfd()
1982 evlist->ctl_fd.pos = -1; in evlist__initialize_ctlfd()
1984 return -1; in evlist__initialize_ctlfd()
1987 evlist->ctl_fd.fd = fd; in evlist__initialize_ctlfd()
1988 evlist->ctl_fd.ack = ack; in evlist__initialize_ctlfd()
1995 return evlist->ctl_fd.pos >= 0; in evlist__ctlfd_initialized()
2000 struct pollfd *entries = evlist->core.pollfd.entries; in evlist__finalize_ctlfd()
2005 entries[evlist->ctl_fd.pos].fd = -1; in evlist__finalize_ctlfd()
2006 entries[evlist->ctl_fd.pos].events = 0; in evlist__finalize_ctlfd()
2007 entries[evlist->ctl_fd.pos].revents = 0; in evlist__finalize_ctlfd()
2009 evlist->ctl_fd.pos = -1; in evlist__finalize_ctlfd()
2010 evlist->ctl_fd.ack = -1; in evlist__finalize_ctlfd()
2011 evlist->ctl_fd.fd = -1; in evlist__finalize_ctlfd()
2025 data_size--; in evlist__ctlfd_recv()
2028 err = read(evlist->ctl_fd.fd, &c, 1); in evlist__ctlfd_recv()
2036 } else if (err == -1) { in evlist__ctlfd_recv()
2042 pr_err("Failed to read from ctlfd %d: %m\n", evlist->ctl_fd.fd); in evlist__ctlfd_recv()
2052 (sizeof(EVLIST_CTL_CMD_ENABLE_TAG)-1))) { in evlist__ctlfd_recv()
2055 (sizeof(EVLIST_CTL_CMD_DISABLE_TAG)-1))) { in evlist__ctlfd_recv()
2058 (sizeof(EVLIST_CTL_CMD_SNAPSHOT_TAG)-1))) { in evlist__ctlfd_recv()
2062 (sizeof(EVLIST_CTL_CMD_EVLIST_TAG)-1))) { in evlist__ctlfd_recv()
2065 (sizeof(EVLIST_CTL_CMD_STOP_TAG)-1))) { in evlist__ctlfd_recv()
2068 (sizeof(EVLIST_CTL_CMD_PING_TAG)-1))) { in evlist__ctlfd_recv()
2080 if (evlist->ctl_fd.ack == -1) in evlist__ctlfd_ack()
2083 err = write(evlist->ctl_fd.ack, EVLIST_CTL_CMD_ACK_TAG, in evlist__ctlfd_ack()
2085 if (err == -1) in evlist__ctlfd_ack()
2086 pr_err("failed to write to ctl_ack_fd %d: %m\n", evlist->ctl_fd.ack); in evlist__ctlfd_ack()
2106 return -1; in get_cmd_arg()
2116 enable ? sizeof(EVLIST_CTL_CMD_ENABLE_TAG) - 1 : in evlist__ctlfd_enable()
2117 sizeof(EVLIST_CTL_CMD_DISABLE_TAG) - 1, in evlist__ctlfd_enable()
2121 return -1; in evlist__ctlfd_enable()
2131 pr_info("Event %s %s\n", evsel->name, in evlist__ctlfd_enable()
2157 sizeof(EVLIST_CTL_CMD_EVLIST_TAG) - 1, in evlist__ctlfd_list()
2161 return -1; in evlist__ctlfd_list()
2165 if (!strcmp(arg, "-v")) { in evlist__ctlfd_list()
2167 } else if (!strcmp(arg, "-g")) { in evlist__ctlfd_list()
2169 } else if (!strcmp(arg, "-F")) { in evlist__ctlfd_list()
2173 return -1; in evlist__ctlfd_list()
2187 int ctlfd_pos = evlist->ctl_fd.pos; in evlist__ctlfd_process()
2188 struct pollfd *entries = evlist->core.pollfd.entries; in evlist__ctlfd_process()
2231 * struct event_enable_time - perf record -D/--delay single time range.
2232 * @start: start of time range to enable events in milliseconds
2233 * @end: end of time range to enable events in milliseconds
2242 static int parse_event_enable_time(const char *str, struct event_enable_time *range, bool first) in parse_event_enable_time() argument
2244 const char *fmt = first ? "%u - %u %n" : " , %u - %u %n"; in parse_event_enable_time()
2249 return -EINVAL; in parse_event_enable_time()
2250 if (range) { in parse_event_enable_time()
2251 range->start = start; in parse_event_enable_time()
2252 range->end = end; in parse_event_enable_time()
2257 static ssize_t parse_event_enable_times(const char *str, struct event_enable_time *range) in parse_event_enable_times() argument
2259 int incr = !!range; in parse_event_enable_times()
2264 ret = parse_event_enable_time(str, range, first); in parse_event_enable_times()
2268 if (!first && range && range->start <= range[-1].end) in parse_event_enable_times()
2269 return -EINVAL; in parse_event_enable_times()
2271 range += incr; in parse_event_enable_times()
2278 * struct event_enable_timer - control structure for perf record -D/--delay.
2306 if (*endptr || d > INT_MAX || d < -1) in str_to_delay()
2323 opts->target.initial_delay = str_to_delay(str); in evlist__parse_event_enable_time()
2324 if (opts->target.initial_delay) in evlist__parse_event_enable_time()
2333 return -EINVAL; in evlist__parse_event_enable_time()
2337 return -ENOMEM; in evlist__parse_event_enable_time()
2339 eet->times = calloc(times_cnt, sizeof(*eet->times)); in evlist__parse_event_enable_time()
2340 if (!eet->times) { in evlist__parse_event_enable_time()
2341 err = -ENOMEM; in evlist__parse_event_enable_time()
2345 if (parse_event_enable_times(str, eet->times) != times_cnt) { in evlist__parse_event_enable_time()
2346 err = -EINVAL; in evlist__parse_event_enable_time()
2350 eet->times_cnt = times_cnt; in evlist__parse_event_enable_time()
2352 eet->timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); in evlist__parse_event_enable_time()
2353 if (eet->timerfd == -1) { in evlist__parse_event_enable_time()
2354 err = -errno; in evlist__parse_event_enable_time()
2359 eet->pollfd_pos = perf_evlist__add_pollfd(&evlist->core, eet->timerfd, NULL, POLLIN, flags); in evlist__parse_event_enable_time()
2360 if (eet->pollfd_pos < 0) { in evlist__parse_event_enable_time()
2361 err = eet->pollfd_pos; in evlist__parse_event_enable_time()
2365 eet->evlist = evlist; in evlist__parse_event_enable_time()
2366 evlist->eet = eet; in evlist__parse_event_enable_time()
2367 opts->target.initial_delay = eet->times[0].start; in evlist__parse_event_enable_time()
2372 close(eet->timerfd); in evlist__parse_event_enable_time()
2374 zfree(&eet->times); in evlist__parse_event_enable_time()
2388 if (timerfd_settime(eet->timerfd, 0, &its, NULL) < 0) { in event_enable_timer__set_timer()
2389 err = -errno; in event_enable_timer__set_timer()
2402 ms = eet->times[0].end - eet->times[0].start; in event_enable_timer__start()
2403 eet->times_step = 1; in event_enable_timer__start()
2416 entries = eet->evlist->core.pollfd.entries; in event_enable_timer__process()
2417 revents = entries[eet->pollfd_pos].revents; in event_enable_timer__process()
2418 entries[eet->pollfd_pos].revents = 0; in event_enable_timer__process()
2421 size_t step = eet->times_step; in event_enable_timer__process()
2425 evlist__disable_non_dummy(eet->evlist); in event_enable_timer__process()
2427 if (pos >= eet->times_cnt - 1) { in event_enable_timer__process()
2433 evlist__enable_non_dummy(eet->evlist); in event_enable_timer__process()
2440 if (pos < eet->times_cnt) { in event_enable_timer__process()
2441 int *times = (int *)eet->times; /* Accessing 'times' as array of int */ in event_enable_timer__process()
2442 int ms = times[step] - times[step - 1]; in event_enable_timer__process()
2444 eet->times_step = step; in event_enable_timer__process()
2456 zfree(&(*ep)->times); in event_enable_timer__exit()
2465 if (evsel->core.idx == idx) in evlist__find_evsel()
2480 …printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "," : "", evsel__name(evsel)); in evlist__scnprintf_evsels()
2482 printed += scnprintf(bf + printed, size - printed, "%s...", printed ? "," : ""); in evlist__scnprintf_evsels()
2495 * For some platforms, the 'mem-loads' event is required to use in evlist__check_mem_load_aux()
2496 * together with 'mem-loads-aux' within a group and 'mem-loads-aux' in evlist__check_mem_load_aux()
2498 * because 'mem-loads-aux' is just an auxiliary event. It doesn't carry in evlist__check_mem_load_aux()
2506 if (leader->name && strstr(leader->name, "mem-loads-aux")) { in evlist__check_mem_load_aux()
2509 pos->core.nr_members = 0; in evlist__check_mem_load_aux()
2516 * evlist__warn_user_requested_cpus() - Check each evsel against requested CPUs
2540 to_test = pmu && pmu->is_core ? pmu->cpus : cpu_map__online(); in evlist__warn_user_requested_cpus()
2547 cpu_list, pmu ? pmu->name : "cpu", buf, evsel__name(pos)); in evlist__warn_user_requested_cpus()
2566 if (strchr(pos->name, '/')) in evlist__uniquify_name()
2569 attributes = strchr(pos->name, ':'); in evlist__uniquify_name()
2575 if (asprintf(&new_name, "%s/%s/%s", pos->pmu ? pos->pmu->name : "", in evlist__uniquify_name()
2576 pos->name, attributes + 1)) { in evlist__uniquify_name()
2577 free(pos->name); in evlist__uniquify_name()
2578 pos->name = new_name; in evlist__uniquify_name()