Lines Matching refs:evsel

62 static int evsel__no_extra_init(struct evsel *evsel __maybe_unused)  in evsel__no_extra_init()
69 static void evsel__no_extra_fini(struct evsel *evsel __maybe_unused) in evsel__no_extra_fini()
75 int (*init)(struct evsel *evsel);
76 void (*fini)(struct evsel *evsel);
78 .size = sizeof(struct evsel),
83 int evsel__object_config(size_t object_size, int (*init)(struct evsel *evsel), in evsel__object_config() argument
84 void (*fini)(struct evsel *evsel)) in evsel__object_config() argument
183 void evsel__calc_id_pos(struct evsel *evsel) in evsel__calc_id_pos() argument
185 evsel->id_pos = __perf_evsel__calc_id_pos(evsel->core.attr.sample_type); in evsel__calc_id_pos()
186 evsel->is_pos = __perf_evsel__calc_is_pos(evsel->core.attr.sample_type); in evsel__calc_id_pos()
189 void __evsel__set_sample_bit(struct evsel *evsel, in __evsel__set_sample_bit() argument
192 if (!(evsel->core.attr.sample_type & bit)) { in __evsel__set_sample_bit()
193 evsel->core.attr.sample_type |= bit; in __evsel__set_sample_bit()
194 evsel->sample_size += sizeof(u64); in __evsel__set_sample_bit()
195 evsel__calc_id_pos(evsel); in __evsel__set_sample_bit()
199 void __evsel__reset_sample_bit(struct evsel *evsel, in __evsel__reset_sample_bit() argument
202 if (evsel->core.attr.sample_type & bit) { in __evsel__reset_sample_bit()
203 evsel->core.attr.sample_type &= ~bit; in __evsel__reset_sample_bit()
204 evsel->sample_size -= sizeof(u64); in __evsel__reset_sample_bit()
205 evsel__calc_id_pos(evsel); in __evsel__reset_sample_bit()
209 void evsel__set_sample_id(struct evsel *evsel, in evsel__set_sample_id() argument
213 evsel__reset_sample_bit(evsel, ID); in evsel__set_sample_id()
214 evsel__set_sample_bit(evsel, IDENTIFIER); in evsel__set_sample_id()
216 evsel__set_sample_bit(evsel, ID); in evsel__set_sample_id()
218 evsel->core.attr.read_format |= PERF_FORMAT_ID; in evsel__set_sample_id()
229 bool evsel__is_function_event(struct evsel *evsel) in evsel__is_function_event() argument
233 return evsel->name && in evsel__is_function_event()
234 !strncmp(FUNCTION_EVENT, evsel->name, sizeof(FUNCTION_EVENT)); in evsel__is_function_event()
239 void evsel__init(struct evsel *evsel, in evsel__init() argument
242 perf_evsel__init(&evsel->core, attr, idx); in evsel__init()
243 evsel->tracking = !idx; in evsel__init()
244 evsel->unit = ""; in evsel__init()
245 evsel->scale = 1.0; in evsel__init()
246 evsel->max_events = ULONG_MAX; in evsel__init()
247 evsel->evlist = NULL; in evsel__init()
248 evsel->bpf_obj = NULL; in evsel__init()
249 evsel->bpf_fd = -1; in evsel__init()
250 INIT_LIST_HEAD(&evsel->config_terms); in evsel__init()
251 INIT_LIST_HEAD(&evsel->bpf_counter_list); in evsel__init()
252 perf_evsel__object.init(evsel); in evsel__init()
253 evsel->sample_size = __evsel__sample_size(attr->sample_type); in evsel__init()
254 evsel__calc_id_pos(evsel); in evsel__init()
255 evsel->cmdline_group_boundary = false; in evsel__init()
256 evsel->metric_expr = NULL; in evsel__init()
257 evsel->metric_name = NULL; in evsel__init()
258 evsel->metric_events = NULL; in evsel__init()
259 evsel->per_pkg_mask = NULL; in evsel__init()
260 evsel->collect_stat = false; in evsel__init()
261 evsel->pmu_name = NULL; in evsel__init()
264 struct evsel *evsel__new_idx(struct perf_event_attr *attr, int idx) in evsel__new_idx()
266 struct evsel *evsel = zalloc(perf_evsel__object.size); in evsel__new_idx() local
268 if (!evsel) in evsel__new_idx()
270 evsel__init(evsel, attr, idx); in evsel__new_idx()
272 if (evsel__is_bpf_output(evsel)) { in evsel__new_idx()
273 evsel->core.attr.sample_type |= (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | in evsel__new_idx()
275 evsel->core.attr.sample_period = 1; in evsel__new_idx()
278 if (evsel__is_clock(evsel)) { in evsel__new_idx()
285 evsel->unit = unit; in evsel__new_idx()
286 evsel->scale = 1e-6; in evsel__new_idx()
289 return evsel; in evsel__new_idx()
297 struct evsel *evsel__new_cycles(bool precise, __u32 type, __u64 config) in evsel__new_cycles()
304 struct evsel *evsel; in evsel__new_cycles() local
316 evsel = evsel__new(&attr); in evsel__new_cycles()
317 if (evsel == NULL) in evsel__new_cycles()
320 evsel->precise_max = true; in evsel__new_cycles()
323 if (asprintf(&evsel->name, "cycles%s%s%.*s", in evsel__new_cycles()
329 return evsel; in evsel__new_cycles()
331 evsel__delete(evsel); in evsel__new_cycles()
332 evsel = NULL; in evsel__new_cycles()
358 static int evsel__copy_config_terms(struct evsel *dst, struct evsel *src) in evsel__copy_config_terms()
370 struct evsel *evsel__clone(struct evsel *orig) in evsel__clone()
372 struct evsel *evsel; in evsel__clone() local
383 evsel = evsel__new(&orig->core.attr); in evsel__clone()
384 if (evsel == NULL) in evsel__clone()
387 evsel->core.cpus = perf_cpu_map__get(orig->core.cpus); in evsel__clone()
388 evsel->core.own_cpus = perf_cpu_map__get(orig->core.own_cpus); in evsel__clone()
389 evsel->core.threads = perf_thread_map__get(orig->core.threads); in evsel__clone()
390 evsel->core.nr_members = orig->core.nr_members; in evsel__clone()
391 evsel->core.system_wide = orig->core.system_wide; in evsel__clone()
394 evsel->name = strdup(orig->name); in evsel__clone()
395 if (evsel->name == NULL) in evsel__clone()
399 evsel->group_name = strdup(orig->group_name); in evsel__clone()
400 if (evsel->group_name == NULL) in evsel__clone()
404 evsel->pmu_name = strdup(orig->pmu_name); in evsel__clone()
405 if (evsel->pmu_name == NULL) in evsel__clone()
409 evsel->filter = strdup(orig->filter); in evsel__clone()
410 if (evsel->filter == NULL) in evsel__clone()
413 evsel->cgrp = cgroup__get(orig->cgrp); in evsel__clone()
414 evsel->tp_format = orig->tp_format; in evsel__clone()
415 evsel->handler = orig->handler; in evsel__clone()
416 evsel->core.leader = orig->core.leader; in evsel__clone()
418 evsel->max_events = orig->max_events; in evsel__clone()
419 evsel->tool_event = orig->tool_event; in evsel__clone()
420 evsel->unit = orig->unit; in evsel__clone()
421 evsel->scale = orig->scale; in evsel__clone()
422 evsel->snapshot = orig->snapshot; in evsel__clone()
423 evsel->per_pkg = orig->per_pkg; in evsel__clone()
424 evsel->percore = orig->percore; in evsel__clone()
425 evsel->precise_max = orig->precise_max; in evsel__clone()
426 evsel->use_uncore_alias = orig->use_uncore_alias; in evsel__clone()
427 evsel->is_libpfm_event = orig->is_libpfm_event; in evsel__clone()
429 evsel->exclude_GH = orig->exclude_GH; in evsel__clone()
430 evsel->sample_read = orig->sample_read; in evsel__clone()
431 evsel->auto_merge_stats = orig->auto_merge_stats; in evsel__clone()
432 evsel->collect_stat = orig->collect_stat; in evsel__clone()
433 evsel->weak_group = orig->weak_group; in evsel__clone()
434 evsel->use_config_name = orig->use_config_name; in evsel__clone()
436 if (evsel__copy_config_terms(evsel, orig) < 0) in evsel__clone()
439 return evsel; in evsel__clone()
442 evsel__delete(evsel); in evsel__clone()
449 struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx) in evsel__newtp_idx()
451 struct evsel *evsel = zalloc(perf_evsel__object.size); in evsel__newtp_idx() local
454 if (evsel == NULL) { in evsel__newtp_idx()
463 if (asprintf(&evsel->name, "%s:%s", sys, name) < 0) in evsel__newtp_idx()
466 evsel->tp_format = trace_event__tp_format(sys, name); in evsel__newtp_idx()
467 if (IS_ERR(evsel->tp_format)) { in evsel__newtp_idx()
468 err = PTR_ERR(evsel->tp_format); in evsel__newtp_idx()
473 attr.config = evsel->tp_format->id; in evsel__newtp_idx()
475 evsel__init(evsel, &attr, idx); in evsel__newtp_idx()
478 return evsel; in evsel__newtp_idx()
481 zfree(&evsel->name); in evsel__newtp_idx()
482 free(evsel); in evsel__newtp_idx()
530 static int evsel__add_modifiers(struct evsel *evsel, char *bf, size_t size) in evsel__add_modifiers() argument
533 struct perf_event_attr *attr = &evsel->core.attr; in evsel__add_modifiers()
566 static int evsel__hw_name(struct evsel *evsel, char *bf, size_t size) in evsel__hw_name() argument
568 int r = scnprintf(bf, size, "%s", __evsel__hw_name(evsel->core.attr.config)); in evsel__hw_name()
569 return r + evsel__add_modifiers(evsel, bf + r, size - r); in evsel__hw_name()
592 static int evsel__sw_name(struct evsel *evsel, char *bf, size_t size) in evsel__sw_name() argument
594 int r = scnprintf(bf, size, "%s", __evsel__sw_name(evsel->core.attr.config)); in evsel__sw_name()
595 return r + evsel__add_modifiers(evsel, bf + r, size - r); in evsel__sw_name()
616 static int evsel__bp_name(struct evsel *evsel, char *bf, size_t size) in evsel__bp_name() argument
618 struct perf_event_attr *attr = &evsel->core.attr; in evsel__bp_name()
620 return r + evsel__add_modifiers(evsel, bf + r, size - r); in evsel__bp_name()
712 static int evsel__hw_cache_name(struct evsel *evsel, char *bf, size_t size) in evsel__hw_cache_name() argument
714 int ret = __evsel__hw_cache_name(evsel->core.attr.config, bf, size); in evsel__hw_cache_name()
715 return ret + evsel__add_modifiers(evsel, bf + ret, size - ret); in evsel__hw_cache_name()
718 static int evsel__raw_name(struct evsel *evsel, char *bf, size_t size) in evsel__raw_name() argument
720 int ret = scnprintf(bf, size, "raw 0x%" PRIx64, evsel->core.attr.config); in evsel__raw_name()
721 return ret + evsel__add_modifiers(evsel, bf + ret, size - ret); in evsel__raw_name()
730 const char *evsel__name(struct evsel *evsel) in evsel__name() argument
734 if (!evsel) in evsel__name()
737 if (evsel->name) in evsel__name()
738 return evsel->name; in evsel__name()
740 switch (evsel->core.attr.type) { in evsel__name()
742 evsel__raw_name(evsel, bf, sizeof(bf)); in evsel__name()
746 evsel__hw_name(evsel, bf, sizeof(bf)); in evsel__name()
750 evsel__hw_cache_name(evsel, bf, sizeof(bf)); in evsel__name()
754 if (evsel->tool_event) in evsel__name()
757 evsel__sw_name(evsel, bf, sizeof(bf)); in evsel__name()
765 evsel__bp_name(evsel, bf, sizeof(bf)); in evsel__name()
770 evsel->core.attr.type); in evsel__name()
774 evsel->name = strdup(bf); in evsel__name()
776 if (evsel->name) in evsel__name()
777 return evsel->name; in evsel__name()
782 const char *evsel__group_name(struct evsel *evsel) in evsel__group_name() argument
784 return evsel->group_name ?: "anon group"; in evsel__group_name()
797 int evsel__group_desc(struct evsel *evsel, char *buf, size_t size) in evsel__group_desc() argument
800 struct evsel *pos; in evsel__group_desc()
801 const char *group_name = evsel__group_name(evsel); in evsel__group_desc()
803 if (!evsel->forced_leader) in evsel__group_desc()
806 ret += scnprintf(buf + ret, size - ret, "%s", evsel__name(evsel)); in evsel__group_desc()
808 for_each_group_member(pos, evsel) in evsel__group_desc()
811 if (!evsel->forced_leader) in evsel__group_desc()
817 static void __evsel__config_callchain(struct evsel *evsel, struct record_opts *opts, in __evsel__config_callchain() argument
820 bool function = evsel__is_function_event(evsel); in __evsel__config_callchain()
821 struct perf_event_attr *attr = &evsel->core.attr; in __evsel__config_callchain()
823 evsel__set_sample_bit(evsel, CALLCHAIN); in __evsel__config_callchain()
838 evsel__set_sample_bit(evsel, BRANCH_STACK); in __evsel__config_callchain()
852 evsel__set_sample_bit(evsel, REGS_USER); in __evsel__config_callchain()
853 evsel__set_sample_bit(evsel, STACK_USER); in __evsel__config_callchain()
876 void evsel__config_callchain(struct evsel *evsel, struct record_opts *opts, in evsel__config_callchain() argument
880 return __evsel__config_callchain(evsel, opts, param); in evsel__config_callchain()
883 static void evsel__reset_callgraph(struct evsel *evsel, struct callchain_param *param) in evsel__reset_callgraph() argument
885 struct perf_event_attr *attr = &evsel->core.attr; in evsel__reset_callgraph()
887 evsel__reset_sample_bit(evsel, CALLCHAIN); in evsel__reset_callgraph()
889 evsel__reset_sample_bit(evsel, BRANCH_STACK); in evsel__reset_callgraph()
895 evsel__reset_sample_bit(evsel, REGS_USER); in evsel__reset_callgraph()
896 evsel__reset_sample_bit(evsel, STACK_USER); in evsel__reset_callgraph()
900 static void evsel__apply_config_terms(struct evsel *evsel, in evsel__apply_config_terms() argument
904 struct list_head *config_terms = &evsel->config_terms; in evsel__apply_config_terms()
905 struct perf_event_attr *attr = &evsel->core.attr; in evsel__apply_config_terms()
920 evsel__reset_sample_bit(evsel, PERIOD); in evsel__apply_config_terms()
927 evsel__set_sample_bit(evsel, PERIOD); in evsel__apply_config_terms()
932 evsel__set_sample_bit(evsel, TIME); in evsel__apply_config_terms()
934 evsel__reset_sample_bit(evsel, TIME); in evsel__apply_config_terms()
941 evsel__set_sample_bit(evsel, BRANCH_STACK); in evsel__apply_config_terms()
945 evsel__reset_sample_bit(evsel, BRANCH_STACK); in evsel__apply_config_terms()
954 evsel->max_events = term->val.max_events; in evsel__apply_config_terms()
1005 evsel->name); in evsel__apply_config_terms()
1019 evsel__reset_callgraph(evsel, &callchain_param); in evsel__apply_config_terms()
1024 evsel__set_sample_bit(evsel, ADDR); in evsel__apply_config_terms()
1025 evsel__set_sample_bit(evsel, DATA_SRC); in evsel__apply_config_terms()
1026 evsel->core.attr.mmap_data = track; in evsel__apply_config_terms()
1028 evsel__config_callchain(evsel, opts, &param); in evsel__apply_config_terms()
1033 struct evsel_config_term *__evsel__get_config_term(struct evsel *evsel, enum evsel_term_type type) in __evsel__get_config_term() argument
1037 list_for_each_entry(term, &evsel->config_terms, list) { in __evsel__get_config_term()
1045 void __weak arch_evsel__set_sample_weight(struct evsel *evsel) in arch_evsel__set_sample_weight() argument
1047 evsel__set_sample_bit(evsel, WEIGHT); in arch_evsel__set_sample_weight()
1078 void evsel__config(struct evsel *evsel, struct record_opts *opts, in evsel__config() argument
1081 struct evsel *leader = evsel__leader(evsel); in evsel__config()
1082 struct perf_event_attr *attr = &evsel->core.attr; in evsel__config()
1083 int track = evsel->tracking; in evsel__config()
1090 evsel__set_sample_bit(evsel, IP); in evsel__config()
1091 evsel__set_sample_bit(evsel, TID); in evsel__config()
1093 if (evsel->sample_read) { in evsel__config()
1094 evsel__set_sample_bit(evsel, READ); in evsel__config()
1100 evsel__set_sample_id(evsel, false); in evsel__config()
1129 evsel__set_sample_bit(evsel, PERIOD); in evsel__config()
1135 evsel->core.attr.read_format |= in evsel__config()
1143 evsel__set_sample_bit(evsel, ADDR); in evsel__config()
1152 if (evsel__is_function_event(evsel)) in evsel__config()
1153 evsel->core.attr.exclude_callchain_user = 1; in evsel__config()
1155 if (callchain && callchain->enabled && !evsel->no_aux_samples) in evsel__config()
1156 evsel__config_callchain(evsel, opts, callchain); in evsel__config()
1158 if (opts->sample_intr_regs && !evsel->no_aux_samples && in evsel__config()
1159 !evsel__is_dummy_event(evsel)) { in evsel__config()
1161 evsel__set_sample_bit(evsel, REGS_INTR); in evsel__config()
1164 if (opts->sample_user_regs && !evsel->no_aux_samples && in evsel__config()
1165 !evsel__is_dummy_event(evsel)) { in evsel__config()
1167 evsel__set_sample_bit(evsel, REGS_USER); in evsel__config()
1171 evsel__set_sample_bit(evsel, CPU); in evsel__config()
1180 evsel__set_sample_bit(evsel, TIME); in evsel__config()
1182 if (opts->raw_samples && !evsel->no_aux_samples) { in evsel__config()
1183 evsel__set_sample_bit(evsel, TIME); in evsel__config()
1184 evsel__set_sample_bit(evsel, RAW); in evsel__config()
1185 evsel__set_sample_bit(evsel, CPU); in evsel__config()
1189 evsel__set_sample_bit(evsel, DATA_SRC); in evsel__config()
1192 evsel__set_sample_bit(evsel, PHYS_ADDR); in evsel__config()
1198 if (opts->branch_stack && !evsel->no_aux_samples) { in evsel__config()
1199 evsel__set_sample_bit(evsel, BRANCH_STACK); in evsel__config()
1204 arch_evsel__set_sample_weight(evsel); in evsel__config()
1225 evsel__set_sample_bit(evsel, CGROUP); in evsel__config()
1229 evsel__set_sample_bit(evsel, DATA_PAGE_SIZE); in evsel__config()
1232 evsel__set_sample_bit(evsel, CODE_PAGE_SIZE); in evsel__config()
1238 evsel__set_sample_bit(evsel, TRANSACTION); in evsel__config()
1241 evsel->core.attr.read_format |= in evsel__config()
1252 if (evsel__is_group_leader(evsel)) in evsel__config()
1259 if (target__none(&opts->target) && evsel__is_group_leader(evsel) && in evsel__config()
1263 if (evsel->immediate) { in evsel__config()
1274 if (evsel->precise_max) in evsel__config()
1287 if (evsel->core.own_cpus || evsel->unit) in evsel__config()
1288 evsel->core.attr.read_format |= PERF_FORMAT_ID; in evsel__config()
1294 evsel__apply_config_terms(evsel, opts, track); in evsel__config()
1296 evsel->ignore_missing_thread = opts->ignore_missing_thread; in evsel__config()
1301 evsel__set_sample_bit(evsel, PERIOD); in evsel__config()
1303 evsel__reset_sample_bit(evsel, PERIOD); in evsel__config()
1314 if (evsel__is_dummy_event(evsel)) in evsel__config()
1315 evsel__reset_sample_bit(evsel, BRANCH_STACK); in evsel__config()
1318 int evsel__set_filter(struct evsel *evsel, const char *filter) in evsel__set_filter() argument
1323 free(evsel->filter); in evsel__set_filter()
1324 evsel->filter = new_filter; in evsel__set_filter()
1331 static int evsel__append_filter(struct evsel *evsel, const char *fmt, const char *filter) in evsel__append_filter() argument
1335 if (evsel->filter == NULL) in evsel__append_filter()
1336 return evsel__set_filter(evsel, filter); in evsel__append_filter()
1338 if (asprintf(&new_filter, fmt, evsel->filter, filter) > 0) { in evsel__append_filter()
1339 free(evsel->filter); in evsel__append_filter()
1340 evsel->filter = new_filter; in evsel__append_filter()
1347 int evsel__append_tp_filter(struct evsel *evsel, const char *filter) in evsel__append_tp_filter() argument
1349 return evsel__append_filter(evsel, "(%s) && (%s)", filter); in evsel__append_tp_filter()
1352 int evsel__append_addr_filter(struct evsel *evsel, const char *filter) in evsel__append_addr_filter() argument
1354 return evsel__append_filter(evsel, "%s,%s", filter); in evsel__append_addr_filter()
1358 int evsel__enable_cpu(struct evsel *evsel, int cpu) in evsel__enable_cpu() argument
1360 return perf_evsel__enable_cpu(&evsel->core, cpu); in evsel__enable_cpu()
1363 int evsel__enable(struct evsel *evsel) in evsel__enable() argument
1365 int err = perf_evsel__enable(&evsel->core); in evsel__enable()
1368 evsel->disabled = false; in evsel__enable()
1373 int evsel__disable_cpu(struct evsel *evsel, int cpu) in evsel__disable_cpu() argument
1375 return perf_evsel__disable_cpu(&evsel->core, cpu); in evsel__disable_cpu()
1378 int evsel__disable(struct evsel *evsel) in evsel__disable() argument
1380 int err = perf_evsel__disable(&evsel->core); in evsel__disable()
1388 evsel->disabled = true; in evsel__disable()
1405 static void evsel__free_config_terms(struct evsel *evsel) in evsel__free_config_terms() argument
1407 free_config_terms(&evsel->config_terms); in evsel__free_config_terms()
1410 void evsel__exit(struct evsel *evsel) in evsel__exit() argument
1412 assert(list_empty(&evsel->core.node)); in evsel__exit()
1413 assert(evsel->evlist == NULL); in evsel__exit()
1414 bpf_counter__destroy(evsel); in evsel__exit()
1415 evsel__free_counts(evsel); in evsel__exit()
1416 perf_evsel__free_fd(&evsel->core); in evsel__exit()
1417 perf_evsel__free_id(&evsel->core); in evsel__exit()
1418 evsel__free_config_terms(evsel); in evsel__exit()
1419 cgroup__put(evsel->cgrp); in evsel__exit()
1420 perf_cpu_map__put(evsel->core.cpus); in evsel__exit()
1421 perf_cpu_map__put(evsel->core.own_cpus); in evsel__exit()
1422 perf_thread_map__put(evsel->core.threads); in evsel__exit()
1423 zfree(&evsel->group_name); in evsel__exit()
1424 zfree(&evsel->name); in evsel__exit()
1425 zfree(&evsel->pmu_name); in evsel__exit()
1426 evsel__zero_per_pkg(evsel); in evsel__exit()
1427 hashmap__free(evsel->per_pkg_mask); in evsel__exit()
1428 evsel->per_pkg_mask = NULL; in evsel__exit()
1429 zfree(&evsel->metric_events); in evsel__exit()
1430 perf_evsel__object.fini(evsel); in evsel__exit()
1433 void evsel__delete(struct evsel *evsel) in evsel__delete() argument
1435 evsel__exit(evsel); in evsel__delete()
1436 free(evsel); in evsel__delete()
1439 void evsel__compute_deltas(struct evsel *evsel, int cpu, int thread, in evsel__compute_deltas() argument
1444 if (!evsel->prev_raw_counts) in evsel__compute_deltas()
1448 tmp = evsel->prev_raw_counts->aggr; in evsel__compute_deltas()
1449 evsel->prev_raw_counts->aggr = *count; in evsel__compute_deltas()
1451 tmp = *perf_counts(evsel->prev_raw_counts, cpu, thread); in evsel__compute_deltas()
1452 *perf_counts(evsel->prev_raw_counts, cpu, thread) = *count; in evsel__compute_deltas()
1479 static int evsel__read_one(struct evsel *evsel, int cpu, int thread) in evsel__read_one() argument
1481 struct perf_counts_values *count = perf_counts(evsel->counts, cpu, thread); in evsel__read_one()
1483 return perf_evsel__read(&evsel->core, cpu, thread, count); in evsel__read_one()
1486 static void evsel__set_count(struct evsel *counter, int cpu, int thread, u64 val, u64 ena, u64 run) in evsel__set_count()
1499 static int evsel__process_group_data(struct evsel *leader, int cpu, int thread, u64 *data) in evsel__process_group_data()
1521 struct evsel *counter; in evsel__process_group_data()
1533 static int evsel__read_group(struct evsel *leader, int cpu, int thread) in evsel__read_group()
1563 int evsel__read_counter(struct evsel *evsel, int cpu, int thread) in evsel__read_counter() argument
1565 u64 read_format = evsel->core.attr.read_format; in evsel__read_counter()
1568 return evsel__read_group(evsel, cpu, thread); in evsel__read_counter()
1570 return evsel__read_one(evsel, cpu, thread); in evsel__read_counter()
1573 int __evsel__read_on_cpu(struct evsel *evsel, int cpu, int thread, bool scale) in __evsel__read_on_cpu() argument
1578 if (FD(evsel, cpu, thread) < 0) in __evsel__read_on_cpu()
1581 if (evsel->counts == NULL && evsel__alloc_counts(evsel, cpu + 1, thread + 1) < 0) in __evsel__read_on_cpu()
1584 if (readn(FD(evsel, cpu, thread), &count, nv * sizeof(u64)) <= 0) in __evsel__read_on_cpu()
1587 evsel__compute_deltas(evsel, cpu, thread, &count); in __evsel__read_on_cpu()
1589 *perf_counts(evsel->counts, cpu, thread) = count; in __evsel__read_on_cpu()
1593 static int evsel__match_other_cpu(struct evsel *evsel, struct evsel *other, in evsel__match_other_cpu() argument
1598 cpuid = perf_cpu_map__cpu(evsel->core.cpus, cpu); in evsel__match_other_cpu()
1602 static int evsel__hybrid_group_cpu(struct evsel *evsel, int cpu) in evsel__hybrid_group_cpu() argument
1604 struct evsel *leader = evsel__leader(evsel); in evsel__hybrid_group_cpu()
1606 if ((evsel__is_hybrid(evsel) && !evsel__is_hybrid(leader)) || in evsel__hybrid_group_cpu()
1607 (!evsel__is_hybrid(evsel) && evsel__is_hybrid(leader))) { in evsel__hybrid_group_cpu()
1608 return evsel__match_other_cpu(evsel, leader, cpu); in evsel__hybrid_group_cpu()
1614 static int get_group_fd(struct evsel *evsel, int cpu, int thread) in get_group_fd() argument
1616 struct evsel *leader = evsel__leader(evsel); in get_group_fd()
1619 if (evsel__is_group_leader(evsel)) in get_group_fd()
1628 cpu = evsel__hybrid_group_cpu(evsel, cpu); in get_group_fd()
1638 static void evsel__remove_fd(struct evsel *pos, int nr_cpus, int nr_threads, int thread_idx) in evsel__remove_fd()
1645 static int update_fds(struct evsel *evsel, in update_fds() argument
1649 struct evsel *pos; in update_fds()
1654 evlist__for_each_entry(evsel->evlist, pos) { in update_fds()
1655 nr_cpus = pos != evsel ? nr_cpus : cpu_idx; in update_fds()
1663 if (pos == evsel) in update_fds()
1669 bool evsel__ignore_missing_thread(struct evsel *evsel, in evsel__ignore_missing_thread() argument
1676 if (!evsel->ignore_missing_thread) in evsel__ignore_missing_thread()
1680 if (evsel->core.system_wide) in evsel__ignore_missing_thread()
1695 if (update_fds(evsel, nr_cpus, cpu, threads->nr, thread)) in evsel__ignore_missing_thread()
1722 bool evsel__precise_ip_fallback(struct evsel *evsel) in evsel__precise_ip_fallback() argument
1725 if (!evsel->precise_max) in evsel__precise_ip_fallback()
1732 if (!evsel->core.attr.precise_ip) { in evsel__precise_ip_fallback()
1733 evsel->core.attr.precise_ip = evsel->precise_ip_original; in evsel__precise_ip_fallback()
1737 if (!evsel->precise_ip_original) in evsel__precise_ip_fallback()
1738 evsel->precise_ip_original = evsel->core.attr.precise_ip; in evsel__precise_ip_fallback()
1740 evsel->core.attr.precise_ip--; in evsel__precise_ip_fallback()
1741 pr_debug2_peo("decreasing precise_ip by one (%d)\n", evsel->core.attr.precise_ip); in evsel__precise_ip_fallback()
1742 display_attr(&evsel->core.attr); in evsel__precise_ip_fallback()
1749 static int __evsel__prepare_open(struct evsel *evsel, struct perf_cpu_map *cpus, in __evsel__prepare_open() argument
1754 if ((perf_missing_features.write_backward && evsel->core.attr.write_backward) || in __evsel__prepare_open()
1755 (perf_missing_features.aux_output && evsel->core.attr.aux_output)) in __evsel__prepare_open()
1778 if (evsel->core.system_wide) in __evsel__prepare_open()
1783 if (evsel->core.fd == NULL && in __evsel__prepare_open()
1784 perf_evsel__alloc_fd(&evsel->core, cpus->nr, nthreads) < 0) in __evsel__prepare_open()
1787 evsel->open_flags = PERF_FLAG_FD_CLOEXEC; in __evsel__prepare_open()
1788 if (evsel->cgrp) in __evsel__prepare_open()
1789 evsel->open_flags |= PERF_FLAG_PID_CGROUP; in __evsel__prepare_open()
1794 static void evsel__disable_missing_features(struct evsel *evsel) in evsel__disable_missing_features() argument
1797 evsel__set_sample_bit(evsel, WEIGHT); in evsel__disable_missing_features()
1798 evsel__reset_sample_bit(evsel, WEIGHT_STRUCT); in evsel__disable_missing_features()
1801 evsel->core.attr.clockid = CLOCK_MONOTONIC; /* should always work */ in evsel__disable_missing_features()
1803 evsel->core.attr.use_clockid = 0; in evsel__disable_missing_features()
1804 evsel->core.attr.clockid = 0; in evsel__disable_missing_features()
1807 evsel->open_flags &= ~(unsigned long)PERF_FLAG_FD_CLOEXEC; in evsel__disable_missing_features()
1809 evsel->core.attr.mmap2 = 0; in evsel__disable_missing_features()
1811 evsel->core.attr.exclude_guest = evsel->core.attr.exclude_host = 0; in evsel__disable_missing_features()
1813 evsel->core.attr.branch_sample_type &= ~(PERF_SAMPLE_BRANCH_NO_FLAGS | in evsel__disable_missing_features()
1815 if (perf_missing_features.group_read && evsel->core.attr.inherit) in evsel__disable_missing_features()
1816 evsel->core.attr.read_format &= ~(PERF_FORMAT_GROUP|PERF_FORMAT_ID); in evsel__disable_missing_features()
1818 evsel->core.attr.ksymbol = 0; in evsel__disable_missing_features()
1820 evsel->core.attr.bpf_event = 0; in evsel__disable_missing_features()
1822 evsel->core.attr.branch_sample_type &= ~PERF_SAMPLE_BRANCH_HW_INDEX; in evsel__disable_missing_features()
1824 evsel->core.attr.sample_id_all = 0; in evsel__disable_missing_features()
1827 int evsel__prepare_open(struct evsel *evsel, struct perf_cpu_map *cpus, in evsel__prepare_open() argument
1832 err = __evsel__prepare_open(evsel, cpus, threads); in evsel__prepare_open()
1836 evsel__disable_missing_features(evsel); in evsel__prepare_open()
1841 bool evsel__detect_missing_features(struct evsel *evsel) in evsel__detect_missing_features() argument
1848 (evsel->core.attr.sample_type & PERF_SAMPLE_WEIGHT_STRUCT)) { in evsel__detect_missing_features()
1853 (evsel->core.attr.sample_type & PERF_SAMPLE_CODE_PAGE_SIZE)) { in evsel__detect_missing_features()
1858 (evsel->core.attr.sample_type & PERF_SAMPLE_DATA_PAGE_SIZE)) { in evsel__detect_missing_features()
1862 } else if (!perf_missing_features.cgroup && evsel->core.attr.cgroup) { in evsel__detect_missing_features()
1867 (evsel->core.attr.branch_sample_type & PERF_SAMPLE_BRANCH_HW_INDEX)) { in evsel__detect_missing_features()
1871 } else if (!perf_missing_features.aux_output && evsel->core.attr.aux_output) { in evsel__detect_missing_features()
1875 } else if (!perf_missing_features.bpf && evsel->core.attr.bpf_event) { in evsel__detect_missing_features()
1879 } else if (!perf_missing_features.ksymbol && evsel->core.attr.ksymbol) { in evsel__detect_missing_features()
1883 } else if (!perf_missing_features.write_backward && evsel->core.attr.write_backward) { in evsel__detect_missing_features()
1887 } else if (!perf_missing_features.clockid_wrong && evsel->core.attr.use_clockid) { in evsel__detect_missing_features()
1891 } else if (!perf_missing_features.clockid && evsel->core.attr.use_clockid) { in evsel__detect_missing_features()
1895 } else if (!perf_missing_features.cloexec && (evsel->open_flags & PERF_FLAG_FD_CLOEXEC)) { in evsel__detect_missing_features()
1899 } else if (!perf_missing_features.mmap2 && evsel->core.attr.mmap2) { in evsel__detect_missing_features()
1904 (evsel->core.attr.exclude_guest || evsel->core.attr.exclude_host)) { in evsel__detect_missing_features()
1913 (evsel->core.attr.branch_sample_type & in evsel__detect_missing_features()
1920 evsel->core.attr.inherit && in evsel__detect_missing_features()
1921 (evsel->core.attr.read_format & PERF_FORMAT_GROUP) && in evsel__detect_missing_features()
1922 evsel__is_group_leader(evsel)) { in evsel__detect_missing_features()
1958 static int evsel__open_cpu(struct evsel *evsel, struct perf_cpu_map *cpus, in evsel__open_cpu() argument
1966 err = __evsel__prepare_open(evsel, cpus, threads); in evsel__open_cpu()
1976 if (evsel->core.system_wide) in evsel__open_cpu()
1981 if (evsel->cgrp) in evsel__open_cpu()
1982 pid = evsel->cgrp->fd; in evsel__open_cpu()
1985 evsel__disable_missing_features(evsel); in evsel__open_cpu()
1987 display_attr(&evsel->core.attr); in evsel__open_cpu()
1997 if (!evsel->cgrp && !evsel->core.system_wide) in evsel__open_cpu()
2000 group_fd = get_group_fd(evsel, cpu, thread); in evsel__open_cpu()
2005 pid, cpus->map[cpu], group_fd, evsel->open_flags); in evsel__open_cpu()
2007 fd = sys_perf_event_open(&evsel->core.attr, pid, cpus->map[cpu], in evsel__open_cpu()
2008 group_fd, evsel->open_flags); in evsel__open_cpu()
2010 FD(evsel, cpu, thread) = fd; in evsel__open_cpu()
2020 bpf_counter__install_pe(evsel, cpu, fd); in evsel__open_cpu()
2023 test_attr__open(&evsel->core.attr, pid, cpus->map[cpu], in evsel__open_cpu()
2024 fd, group_fd, evsel->open_flags); in evsel__open_cpu()
2029 if (evsel->bpf_fd >= 0) { in evsel__open_cpu()
2031 int bpf_fd = evsel->bpf_fd; in evsel__open_cpu()
2061 if (evsel__precise_ip_fallback(evsel)) in evsel__open_cpu()
2064 if (evsel__ignore_missing_thread(evsel, cpus->nr, cpu, threads, thread, err)) { in evsel__open_cpu()
2082 if (evsel__detect_missing_features(evsel)) in evsel__open_cpu()
2091 if (FD(evsel, cpu, thread) >= 0) in evsel__open_cpu()
2092 close(FD(evsel, cpu, thread)); in evsel__open_cpu()
2093 FD(evsel, cpu, thread) = -1; in evsel__open_cpu()
2101 int evsel__open(struct evsel *evsel, struct perf_cpu_map *cpus, in evsel__open() argument
2104 return evsel__open_cpu(evsel, cpus, threads, 0, cpus ? cpus->nr : 1); in evsel__open()
2107 void evsel__close(struct evsel *evsel) in evsel__close() argument
2109 perf_evsel__close(&evsel->core); in evsel__close()
2110 perf_evsel__free_id(&evsel->core); in evsel__close()
2113 int evsel__open_per_cpu(struct evsel *evsel, struct perf_cpu_map *cpus, int cpu) in evsel__open_per_cpu() argument
2116 return evsel__open_cpu(evsel, cpus, NULL, 0, in evsel__open_per_cpu()
2119 return evsel__open_cpu(evsel, cpus, NULL, cpu, cpu + 1); in evsel__open_per_cpu()
2122 int evsel__open_per_thread(struct evsel *evsel, struct perf_thread_map *threads) in evsel__open_per_thread() argument
2124 return evsel__open(evsel, NULL, threads); in evsel__open_per_thread()
2127 static int perf_evsel__parse_id_sample(const struct evsel *evsel, in perf_evsel__parse_id_sample() argument
2131 u64 type = evsel->core.attr.sample_type; in perf_evsel__parse_id_sample()
2133 bool swapped = evsel->needs_swap; in perf_evsel__parse_id_sample()
2224 int evsel__parse_sample(struct evsel *evsel, union perf_event *event, in evsel__parse_sample() argument
2227 u64 type = evsel->core.attr.sample_type; in evsel__parse_sample()
2228 bool swapped = evsel->needs_swap; in evsel__parse_sample()
2243 data->period = evsel->core.attr.sample_period; in evsel__parse_sample()
2250 if (!evsel->core.attr.sample_id_all) in evsel__parse_sample()
2252 return perf_evsel__parse_id_sample(evsel, event, data); in evsel__parse_sample()
2257 if (perf_event__check_size(event, evsel->sample_size)) in evsel__parse_sample()
2323 u64 read_format = evsel->core.attr.read_format; in evsel__parse_sample()
2419 if (evsel__has_branch_hw_idx(evsel)) in evsel__parse_sample()
2433 u64 mask = evsel->core.attr.sample_regs_user; in evsel__parse_sample()
2489 u64 mask = evsel->core.attr.sample_regs_intr; in evsel__parse_sample()
2539 int evsel__parse_sample_timestamp(struct evsel *evsel, union perf_event *event, in evsel__parse_sample_timestamp() argument
2542 u64 type = evsel->core.attr.sample_type; in evsel__parse_sample_timestamp()
2553 if (!evsel->core.attr.sample_id_all) in evsel__parse_sample_timestamp()
2555 if (perf_evsel__parse_id_sample(evsel, event, &data)) in evsel__parse_sample_timestamp()
2564 if (perf_event__check_size(event, evsel->sample_size)) in evsel__parse_sample_timestamp()
2582 struct tep_format_field *evsel__field(struct evsel *evsel, const char *name) in evsel__field() argument
2584 return tep_find_field(evsel->tp_format, name); in evsel__field()
2587 void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name) in evsel__rawptr() argument
2589 struct tep_format_field *field = evsel__field(evsel, name); in evsel__rawptr()
2644 u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name) in evsel__intval() argument
2646 struct tep_format_field *field = evsel__field(evsel, name); in evsel__intval()
2651 return field ? format_field__intval(field, sample, evsel->needs_swap) : 0; in evsel__intval()
2654 bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize) in evsel__fallback() argument
2659 evsel->core.attr.type == PERF_TYPE_HARDWARE && in evsel__fallback()
2660 evsel->core.attr.config == PERF_COUNT_HW_CPU_CYCLES) { in evsel__fallback()
2672 evsel->core.attr.type = PERF_TYPE_SOFTWARE; in evsel__fallback()
2673 evsel->core.attr.config = PERF_COUNT_SW_CPU_CLOCK; in evsel__fallback()
2675 zfree(&evsel->name); in evsel__fallback()
2677 } else if (err == EACCES && !evsel->core.attr.exclude_kernel && in evsel__fallback()
2679 const char *name = evsel__name(evsel); in evsel__fallback()
2684 if (evsel->core.attr.exclude_user) in evsel__fallback()
2689 (strchr(name, ':') && !evsel->is_libpfm_event)) in evsel__fallback()
2695 if (evsel->name) in evsel__fallback()
2696 free(evsel->name); in evsel__fallback()
2697 evsel->name = new_name; in evsel__fallback()
2701 evsel->core.attr.exclude_kernel = 1; in evsel__fallback()
2702 evsel->core.attr.exclude_hv = 1; in evsel__fallback()
2746 int evsel__open_strerror(struct evsel *evsel, struct target *target, in evsel__open_strerror() argument
2769 "No permission to enable %s event.\n\n", evsel__name(evsel)); in evsel__open_strerror()
2787 return scnprintf(msg, size, "The %s event is not supported.", evsel__name(evsel)); in evsel__open_strerror()
2795 if (evsel__has_callchain(evsel) && in evsel__open_strerror()
2808 if (evsel->core.attr.aux_output) in evsel__open_strerror()
2811 evsel__name(evsel)); in evsel__open_strerror()
2812 if (evsel->core.attr.sample_period != 0) in evsel__open_strerror()
2815 evsel__name(evsel)); in evsel__open_strerror()
2816 if (evsel->core.attr.precise_ip) in evsel__open_strerror()
2820 if (evsel->core.attr.type == PERF_TYPE_HARDWARE) in evsel__open_strerror()
2832 …if (evsel->core.attr.sample_type & PERF_SAMPLE_CODE_PAGE_SIZE && perf_missing_features.code_page_s… in evsel__open_strerror()
2834 …if (evsel->core.attr.sample_type & PERF_SAMPLE_DATA_PAGE_SIZE && perf_missing_features.data_page_s… in evsel__open_strerror()
2836 if (evsel->core.attr.write_backward && perf_missing_features.write_backward) in evsel__open_strerror()
2855 err, str_error_r(err, sbuf, sizeof(sbuf)), evsel__name(evsel)); in evsel__open_strerror()
2858 struct perf_env *evsel__env(struct evsel *evsel) in evsel__env() argument
2860 if (evsel && evsel->evlist) in evsel__env()
2861 return evsel->evlist->env; in evsel__env()
2865 static int store_evsel_ids(struct evsel *evsel, struct evlist *evlist) in store_evsel_ids() argument
2869 for (cpu = 0; cpu < xyarray__max_x(evsel->core.fd); cpu++) { in store_evsel_ids()
2870 for (thread = 0; thread < xyarray__max_y(evsel->core.fd); in store_evsel_ids()
2872 int fd = FD(evsel, cpu, thread); in store_evsel_ids()
2874 if (perf_evlist__id_add_fd(&evlist->core, &evsel->core, in store_evsel_ids()
2883 int evsel__store_ids(struct evsel *evsel, struct evlist *evlist) in evsel__store_ids() argument
2885 struct perf_cpu_map *cpus = evsel->core.cpus; in evsel__store_ids()
2886 struct perf_thread_map *threads = evsel->core.threads; in evsel__store_ids()
2888 if (perf_evsel__alloc_id(&evsel->core, cpus->nr, threads->nr)) in evsel__store_ids()
2891 return store_evsel_ids(evsel, evlist); in evsel__store_ids()
2894 void evsel__zero_per_pkg(struct evsel *evsel) in evsel__zero_per_pkg() argument
2899 if (evsel->per_pkg_mask) { in evsel__zero_per_pkg()
2900 hashmap__for_each_entry(evsel->per_pkg_mask, cur, bkt) in evsel__zero_per_pkg()
2903 hashmap__clear(evsel->per_pkg_mask); in evsel__zero_per_pkg()
2907 bool evsel__is_hybrid(struct evsel *evsel) in evsel__is_hybrid() argument
2909 return evsel->pmu_name && perf_pmu__is_hybrid(evsel->pmu_name); in evsel__is_hybrid()
2912 struct evsel *evsel__leader(struct evsel *evsel) in evsel__leader() argument
2914 return container_of(evsel->core.leader, struct evsel, core); in evsel__leader()
2917 bool evsel__has_leader(struct evsel *evsel, struct evsel *leader) in evsel__has_leader() argument
2919 return evsel->core.leader == &leader->core; in evsel__has_leader()
2922 bool evsel__is_leader(struct evsel *evsel) in evsel__is_leader() argument
2924 return evsel__has_leader(evsel, evsel); in evsel__is_leader()
2927 void evsel__set_leader(struct evsel *evsel, struct evsel *leader) in evsel__set_leader() argument
2929 evsel->core.leader = &leader->core; in evsel__set_leader()