Lines Matching refs:evsel

59 static int perf_evsel__no_extra_init(struct evsel *evsel __maybe_unused)  in perf_evsel__no_extra_init()
66 static void perf_evsel__no_extra_fini(struct evsel *evsel __maybe_unused) in perf_evsel__no_extra_fini()
72 int (*init)(struct evsel *evsel);
73 void (*fini)(struct evsel *evsel);
75 .size = sizeof(struct evsel),
81 int (*init)(struct evsel *evsel), in perf_evsel__object_config() argument
82 void (*fini)(struct evsel *evsel)) in perf_evsel__object_config() argument
181 void perf_evsel__calc_id_pos(struct evsel *evsel) in perf_evsel__calc_id_pos() argument
183 evsel->id_pos = __perf_evsel__calc_id_pos(evsel->core.attr.sample_type); in perf_evsel__calc_id_pos()
184 evsel->is_pos = __perf_evsel__calc_is_pos(evsel->core.attr.sample_type); in perf_evsel__calc_id_pos()
187 void __perf_evsel__set_sample_bit(struct evsel *evsel, in __perf_evsel__set_sample_bit() argument
190 if (!(evsel->core.attr.sample_type & bit)) { in __perf_evsel__set_sample_bit()
191 evsel->core.attr.sample_type |= bit; in __perf_evsel__set_sample_bit()
192 evsel->sample_size += sizeof(u64); in __perf_evsel__set_sample_bit()
193 perf_evsel__calc_id_pos(evsel); in __perf_evsel__set_sample_bit()
197 void __perf_evsel__reset_sample_bit(struct evsel *evsel, in __perf_evsel__reset_sample_bit() argument
200 if (evsel->core.attr.sample_type & bit) { in __perf_evsel__reset_sample_bit()
201 evsel->core.attr.sample_type &= ~bit; in __perf_evsel__reset_sample_bit()
202 evsel->sample_size -= sizeof(u64); in __perf_evsel__reset_sample_bit()
203 perf_evsel__calc_id_pos(evsel); in __perf_evsel__reset_sample_bit()
207 void perf_evsel__set_sample_id(struct evsel *evsel, in perf_evsel__set_sample_id() argument
211 perf_evsel__reset_sample_bit(evsel, ID); in perf_evsel__set_sample_id()
212 perf_evsel__set_sample_bit(evsel, IDENTIFIER); in perf_evsel__set_sample_id()
214 perf_evsel__set_sample_bit(evsel, ID); in perf_evsel__set_sample_id()
216 evsel->core.attr.read_format |= PERF_FORMAT_ID; in perf_evsel__set_sample_id()
227 bool perf_evsel__is_function_event(struct evsel *evsel) in perf_evsel__is_function_event() argument
231 return evsel->name && in perf_evsel__is_function_event()
232 !strncmp(FUNCTION_EVENT, evsel->name, sizeof(FUNCTION_EVENT)); in perf_evsel__is_function_event()
237 void evsel__init(struct evsel *evsel, in evsel__init() argument
240 perf_evsel__init(&evsel->core, attr); in evsel__init()
241 evsel->idx = idx; in evsel__init()
242 evsel->tracking = !idx; in evsel__init()
243 evsel->leader = evsel; 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 perf_evsel__object.init(evsel); in evsel__init()
252 evsel->sample_size = __perf_evsel__sample_size(attr->sample_type); in evsel__init()
253 perf_evsel__calc_id_pos(evsel); in evsel__init()
254 evsel->cmdline_group_boundary = false; in evsel__init()
255 evsel->metric_expr = NULL; in evsel__init()
256 evsel->metric_name = NULL; in evsel__init()
257 evsel->metric_events = NULL; in evsel__init()
258 evsel->collect_stat = false; in evsel__init()
259 evsel->pmu_name = NULL; in evsel__init()
262 struct evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx) in perf_evsel__new_idx()
264 struct evsel *evsel = zalloc(perf_evsel__object.size); in perf_evsel__new_idx() local
266 if (!evsel) in perf_evsel__new_idx()
268 evsel__init(evsel, attr, idx); in perf_evsel__new_idx()
270 if (perf_evsel__is_bpf_output(evsel)) { in perf_evsel__new_idx()
271 evsel->core.attr.sample_type |= (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | in perf_evsel__new_idx()
273 evsel->core.attr.sample_period = 1; in perf_evsel__new_idx()
276 if (perf_evsel__is_clock(evsel)) { in perf_evsel__new_idx()
283 evsel->unit = unit; in perf_evsel__new_idx()
284 evsel->scale = 1e-6; in perf_evsel__new_idx()
287 return evsel; in perf_evsel__new_idx()
295 struct evsel *perf_evsel__new_cycles(bool precise) in perf_evsel__new_cycles()
302 struct evsel *evsel; in perf_evsel__new_cycles() local
314 evsel = evsel__new(&attr); in perf_evsel__new_cycles()
315 if (evsel == NULL) in perf_evsel__new_cycles()
318 evsel->precise_max = true; in perf_evsel__new_cycles()
321 if (asprintf(&evsel->name, "cycles%s%s%.*s", in perf_evsel__new_cycles()
327 return evsel; in perf_evsel__new_cycles()
329 evsel__delete(evsel); in perf_evsel__new_cycles()
330 evsel = NULL; in perf_evsel__new_cycles()
337 struct evsel *perf_evsel__newtp_idx(const char *sys, const char *name, int idx) in perf_evsel__newtp_idx()
339 struct evsel *evsel = zalloc(perf_evsel__object.size); in perf_evsel__newtp_idx() local
342 if (evsel == NULL) { in perf_evsel__newtp_idx()
351 if (asprintf(&evsel->name, "%s:%s", sys, name) < 0) in perf_evsel__newtp_idx()
354 evsel->tp_format = trace_event__tp_format(sys, name); in perf_evsel__newtp_idx()
355 if (IS_ERR(evsel->tp_format)) { in perf_evsel__newtp_idx()
356 err = PTR_ERR(evsel->tp_format); in perf_evsel__newtp_idx()
361 attr.config = evsel->tp_format->id; in perf_evsel__newtp_idx()
363 evsel__init(evsel, &attr, idx); in perf_evsel__newtp_idx()
366 return evsel; in perf_evsel__newtp_idx()
369 zfree(&evsel->name); in perf_evsel__newtp_idx()
370 free(evsel); in perf_evsel__newtp_idx()
396 static int perf_evsel__add_modifiers(struct evsel *evsel, char *bf, size_t size) in perf_evsel__add_modifiers() argument
399 struct perf_event_attr *attr = &evsel->core.attr; in perf_evsel__add_modifiers()
432 static int perf_evsel__hw_name(struct evsel *evsel, char *bf, size_t size) in perf_evsel__hw_name() argument
434 int r = scnprintf(bf, size, "%s", __perf_evsel__hw_name(evsel->core.attr.config)); in perf_evsel__hw_name()
435 return r + perf_evsel__add_modifiers(evsel, bf + r, size - r); in perf_evsel__hw_name()
458 static int perf_evsel__sw_name(struct evsel *evsel, char *bf, size_t size) in perf_evsel__sw_name() argument
460 int r = scnprintf(bf, size, "%s", __perf_evsel__sw_name(evsel->core.attr.config)); in perf_evsel__sw_name()
461 return r + perf_evsel__add_modifiers(evsel, bf + r, size - r); in perf_evsel__sw_name()
482 static int perf_evsel__bp_name(struct evsel *evsel, char *bf, size_t size) in perf_evsel__bp_name() argument
484 struct perf_event_attr *attr = &evsel->core.attr; in perf_evsel__bp_name()
486 return r + perf_evsel__add_modifiers(evsel, bf + r, size - r); in perf_evsel__bp_name()
582 static int perf_evsel__hw_cache_name(struct evsel *evsel, char *bf, size_t size) in perf_evsel__hw_cache_name() argument
584 int ret = __perf_evsel__hw_cache_name(evsel->core.attr.config, bf, size); in perf_evsel__hw_cache_name()
585 return ret + perf_evsel__add_modifiers(evsel, bf + ret, size - ret); in perf_evsel__hw_cache_name()
588 static int perf_evsel__raw_name(struct evsel *evsel, char *bf, size_t size) in perf_evsel__raw_name() argument
590 int ret = scnprintf(bf, size, "raw 0x%" PRIx64, evsel->core.attr.config); in perf_evsel__raw_name()
591 return ret + perf_evsel__add_modifiers(evsel, bf + ret, size - ret); in perf_evsel__raw_name()
600 const char *perf_evsel__name(struct evsel *evsel) in perf_evsel__name() argument
604 if (!evsel) in perf_evsel__name()
607 if (evsel->name) in perf_evsel__name()
608 return evsel->name; in perf_evsel__name()
610 switch (evsel->core.attr.type) { in perf_evsel__name()
612 perf_evsel__raw_name(evsel, bf, sizeof(bf)); in perf_evsel__name()
616 perf_evsel__hw_name(evsel, bf, sizeof(bf)); in perf_evsel__name()
620 perf_evsel__hw_cache_name(evsel, bf, sizeof(bf)); in perf_evsel__name()
624 if (evsel->tool_event) in perf_evsel__name()
627 perf_evsel__sw_name(evsel, bf, sizeof(bf)); in perf_evsel__name()
635 perf_evsel__bp_name(evsel, bf, sizeof(bf)); in perf_evsel__name()
640 evsel->core.attr.type); in perf_evsel__name()
644 evsel->name = strdup(bf); in perf_evsel__name()
646 if (evsel->name) in perf_evsel__name()
647 return evsel->name; in perf_evsel__name()
652 const char *perf_evsel__group_name(struct evsel *evsel) in perf_evsel__group_name() argument
654 return evsel->group_name ?: "anon group"; in perf_evsel__group_name()
667 int perf_evsel__group_desc(struct evsel *evsel, char *buf, size_t size) in perf_evsel__group_desc() argument
670 struct evsel *pos; in perf_evsel__group_desc()
671 const char *group_name = perf_evsel__group_name(evsel); in perf_evsel__group_desc()
673 if (!evsel->forced_leader) in perf_evsel__group_desc()
677 perf_evsel__name(evsel)); in perf_evsel__group_desc()
679 for_each_group_member(pos, evsel) in perf_evsel__group_desc()
683 if (!evsel->forced_leader) in perf_evsel__group_desc()
689 static void __perf_evsel__config_callchain(struct evsel *evsel, in __perf_evsel__config_callchain() argument
693 bool function = perf_evsel__is_function_event(evsel); in __perf_evsel__config_callchain()
694 struct perf_event_attr *attr = &evsel->core.attr; in __perf_evsel__config_callchain()
696 perf_evsel__set_sample_bit(evsel, CALLCHAIN); in __perf_evsel__config_callchain()
711 perf_evsel__set_sample_bit(evsel, BRANCH_STACK); in __perf_evsel__config_callchain()
724 perf_evsel__set_sample_bit(evsel, REGS_USER); in __perf_evsel__config_callchain()
725 perf_evsel__set_sample_bit(evsel, STACK_USER); in __perf_evsel__config_callchain()
748 void perf_evsel__config_callchain(struct evsel *evsel, in perf_evsel__config_callchain() argument
753 return __perf_evsel__config_callchain(evsel, opts, param); in perf_evsel__config_callchain()
757 perf_evsel__reset_callgraph(struct evsel *evsel, in perf_evsel__reset_callgraph() argument
760 struct perf_event_attr *attr = &evsel->core.attr; in perf_evsel__reset_callgraph()
762 perf_evsel__reset_sample_bit(evsel, CALLCHAIN); in perf_evsel__reset_callgraph()
764 perf_evsel__reset_sample_bit(evsel, BRANCH_STACK); in perf_evsel__reset_callgraph()
769 perf_evsel__reset_sample_bit(evsel, REGS_USER); in perf_evsel__reset_callgraph()
770 perf_evsel__reset_sample_bit(evsel, STACK_USER); in perf_evsel__reset_callgraph()
774 static void apply_config_terms(struct evsel *evsel, in apply_config_terms() argument
778 struct list_head *config_terms = &evsel->config_terms; in apply_config_terms()
779 struct perf_event_attr *attr = &evsel->core.attr; in apply_config_terms()
794 perf_evsel__reset_sample_bit(evsel, PERIOD); in apply_config_terms()
801 perf_evsel__set_sample_bit(evsel, PERIOD); in apply_config_terms()
806 perf_evsel__set_sample_bit(evsel, TIME); in apply_config_terms()
808 perf_evsel__reset_sample_bit(evsel, TIME); in apply_config_terms()
815 perf_evsel__set_sample_bit(evsel, BRANCH_STACK); in apply_config_terms()
819 perf_evsel__reset_sample_bit(evsel, BRANCH_STACK); in apply_config_terms()
828 evsel->max_events = term->val.max_events; in apply_config_terms()
874 evsel->name); in apply_config_terms()
888 perf_evsel__reset_callgraph(evsel, &callchain_param); in apply_config_terms()
893 perf_evsel__set_sample_bit(evsel, ADDR); in apply_config_terms()
894 perf_evsel__set_sample_bit(evsel, DATA_SRC); in apply_config_terms()
895 evsel->core.attr.mmap_data = track; in apply_config_terms()
897 perf_evsel__config_callchain(evsel, opts, &param); in apply_config_terms()
902 static bool is_dummy_event(struct evsel *evsel) in is_dummy_event() argument
904 return (evsel->core.attr.type == PERF_TYPE_SOFTWARE) && in is_dummy_event()
905 (evsel->core.attr.config == PERF_COUNT_SW_DUMMY); in is_dummy_event()
936 void perf_evsel__config(struct evsel *evsel, struct record_opts *opts, in perf_evsel__config() argument
939 struct evsel *leader = evsel->leader; in perf_evsel__config()
940 struct perf_event_attr *attr = &evsel->core.attr; in perf_evsel__config()
941 int track = evsel->tracking; in perf_evsel__config()
948 perf_evsel__set_sample_bit(evsel, IP); in perf_evsel__config()
949 perf_evsel__set_sample_bit(evsel, TID); in perf_evsel__config()
951 if (evsel->sample_read) { in perf_evsel__config()
952 perf_evsel__set_sample_bit(evsel, READ); in perf_evsel__config()
958 perf_evsel__set_sample_id(evsel, false); in perf_evsel__config()
977 perf_evsel__set_sample_bit(evsel, PERIOD); in perf_evsel__config()
989 if ((leader != evsel) && leader->sample_read) { in perf_evsel__config()
1008 evsel->core.attr.read_format |= in perf_evsel__config()
1016 perf_evsel__set_sample_bit(evsel, ADDR); in perf_evsel__config()
1025 if (perf_evsel__is_function_event(evsel)) in perf_evsel__config()
1026 evsel->core.attr.exclude_callchain_user = 1; in perf_evsel__config()
1028 if (callchain && callchain->enabled && !evsel->no_aux_samples) in perf_evsel__config()
1029 perf_evsel__config_callchain(evsel, opts, callchain); in perf_evsel__config()
1033 perf_evsel__set_sample_bit(evsel, REGS_INTR); in perf_evsel__config()
1038 perf_evsel__set_sample_bit(evsel, REGS_USER); in perf_evsel__config()
1042 perf_evsel__set_sample_bit(evsel, CPU); in perf_evsel__config()
1051 perf_evsel__set_sample_bit(evsel, TIME); in perf_evsel__config()
1053 if (opts->raw_samples && !evsel->no_aux_samples) { in perf_evsel__config()
1054 perf_evsel__set_sample_bit(evsel, TIME); in perf_evsel__config()
1055 perf_evsel__set_sample_bit(evsel, RAW); in perf_evsel__config()
1056 perf_evsel__set_sample_bit(evsel, CPU); in perf_evsel__config()
1060 perf_evsel__set_sample_bit(evsel, DATA_SRC); in perf_evsel__config()
1063 perf_evsel__set_sample_bit(evsel, PHYS_ADDR); in perf_evsel__config()
1069 if (opts->branch_stack && !evsel->no_aux_samples) { in perf_evsel__config()
1070 perf_evsel__set_sample_bit(evsel, BRANCH_STACK); in perf_evsel__config()
1075 perf_evsel__set_sample_bit(evsel, WEIGHT); in perf_evsel__config()
1091 perf_evsel__set_sample_bit(evsel, TRANSACTION); in perf_evsel__config()
1094 evsel->core.attr.read_format |= in perf_evsel__config()
1105 if (perf_evsel__is_group_leader(evsel)) in perf_evsel__config()
1112 if (target__none(&opts->target) && perf_evsel__is_group_leader(evsel) && in perf_evsel__config()
1116 if (evsel->immediate) { in perf_evsel__config()
1127 if (evsel->precise_max) in perf_evsel__config()
1140 if (evsel->core.own_cpus || evsel->unit) in perf_evsel__config()
1141 evsel->core.attr.read_format |= PERF_FORMAT_ID; in perf_evsel__config()
1147 apply_config_terms(evsel, opts, track); in perf_evsel__config()
1149 evsel->ignore_missing_thread = opts->ignore_missing_thread; in perf_evsel__config()
1154 perf_evsel__set_sample_bit(evsel, PERIOD); in perf_evsel__config()
1156 perf_evsel__reset_sample_bit(evsel, PERIOD); in perf_evsel__config()
1164 if (opts->initial_delay && is_dummy_event(evsel)) in perf_evsel__config()
1165 perf_evsel__reset_sample_bit(evsel, BRANCH_STACK); in perf_evsel__config()
1168 int perf_evsel__set_filter(struct evsel *evsel, const char *filter) in perf_evsel__set_filter() argument
1173 free(evsel->filter); in perf_evsel__set_filter()
1174 evsel->filter = new_filter; in perf_evsel__set_filter()
1181 static int perf_evsel__append_filter(struct evsel *evsel, in perf_evsel__append_filter() argument
1186 if (evsel->filter == NULL) in perf_evsel__append_filter()
1187 return perf_evsel__set_filter(evsel, filter); in perf_evsel__append_filter()
1189 if (asprintf(&new_filter, fmt, evsel->filter, filter) > 0) { in perf_evsel__append_filter()
1190 free(evsel->filter); in perf_evsel__append_filter()
1191 evsel->filter = new_filter; in perf_evsel__append_filter()
1198 int perf_evsel__append_tp_filter(struct evsel *evsel, const char *filter) in perf_evsel__append_tp_filter() argument
1200 return perf_evsel__append_filter(evsel, "(%s) && (%s)", filter); in perf_evsel__append_tp_filter()
1203 int perf_evsel__append_addr_filter(struct evsel *evsel, const char *filter) in perf_evsel__append_addr_filter() argument
1205 return perf_evsel__append_filter(evsel, "%s,%s", filter); in perf_evsel__append_addr_filter()
1208 int evsel__enable(struct evsel *evsel) in evsel__enable() argument
1210 int err = perf_evsel__enable(&evsel->core); in evsel__enable()
1213 evsel->disabled = false; in evsel__enable()
1218 int evsel__disable(struct evsel *evsel) in evsel__disable() argument
1220 int err = perf_evsel__disable(&evsel->core); in evsel__disable()
1228 evsel->disabled = true; in evsel__disable()
1233 static void perf_evsel__free_config_terms(struct evsel *evsel) in perf_evsel__free_config_terms() argument
1237 list_for_each_entry_safe(term, h, &evsel->config_terms, list) { in perf_evsel__free_config_terms()
1243 void perf_evsel__exit(struct evsel *evsel) in perf_evsel__exit() argument
1245 assert(list_empty(&evsel->core.node)); in perf_evsel__exit()
1246 assert(evsel->evlist == NULL); in perf_evsel__exit()
1247 perf_evsel__free_counts(evsel); in perf_evsel__exit()
1248 perf_evsel__free_fd(&evsel->core); in perf_evsel__exit()
1249 perf_evsel__free_id(&evsel->core); in perf_evsel__exit()
1250 perf_evsel__free_config_terms(evsel); in perf_evsel__exit()
1251 cgroup__put(evsel->cgrp); in perf_evsel__exit()
1252 perf_cpu_map__put(evsel->core.cpus); in perf_evsel__exit()
1253 perf_cpu_map__put(evsel->core.own_cpus); in perf_evsel__exit()
1254 perf_thread_map__put(evsel->core.threads); in perf_evsel__exit()
1255 zfree(&evsel->group_name); in perf_evsel__exit()
1256 zfree(&evsel->name); in perf_evsel__exit()
1257 perf_evsel__object.fini(evsel); in perf_evsel__exit()
1260 void evsel__delete(struct evsel *evsel) in evsel__delete() argument
1262 perf_evsel__exit(evsel); in evsel__delete()
1263 free(evsel); in evsel__delete()
1266 void perf_evsel__compute_deltas(struct evsel *evsel, int cpu, int thread, in perf_evsel__compute_deltas() argument
1271 if (!evsel->prev_raw_counts) in perf_evsel__compute_deltas()
1275 tmp = evsel->prev_raw_counts->aggr; in perf_evsel__compute_deltas()
1276 evsel->prev_raw_counts->aggr = *count; in perf_evsel__compute_deltas()
1278 tmp = *perf_counts(evsel->prev_raw_counts, cpu, thread); in perf_evsel__compute_deltas()
1279 *perf_counts(evsel->prev_raw_counts, cpu, thread) = *count; in perf_evsel__compute_deltas()
1307 perf_evsel__read_one(struct evsel *evsel, int cpu, int thread) in perf_evsel__read_one() argument
1309 struct perf_counts_values *count = perf_counts(evsel->counts, cpu, thread); in perf_evsel__read_one()
1311 return perf_evsel__read(&evsel->core, cpu, thread, count); in perf_evsel__read_one()
1315 perf_evsel__set_count(struct evsel *counter, int cpu, int thread, in perf_evsel__set_count()
1330 perf_evsel__process_group_data(struct evsel *leader, in perf_evsel__process_group_data()
1354 struct evsel *counter; in perf_evsel__process_group_data()
1368 perf_evsel__read_group(struct evsel *leader, int cpu, int thread) in perf_evsel__read_group()
1398 int perf_evsel__read_counter(struct evsel *evsel, int cpu, int thread) in perf_evsel__read_counter() argument
1400 u64 read_format = evsel->core.attr.read_format; in perf_evsel__read_counter()
1403 return perf_evsel__read_group(evsel, cpu, thread); in perf_evsel__read_counter()
1405 return perf_evsel__read_one(evsel, cpu, thread); in perf_evsel__read_counter()
1408 int __perf_evsel__read_on_cpu(struct evsel *evsel, in __perf_evsel__read_on_cpu() argument
1414 if (FD(evsel, cpu, thread) < 0) in __perf_evsel__read_on_cpu()
1417 if (evsel->counts == NULL && perf_evsel__alloc_counts(evsel, cpu + 1, thread + 1) < 0) in __perf_evsel__read_on_cpu()
1420 if (readn(FD(evsel, cpu, thread), &count, nv * sizeof(u64)) <= 0) in __perf_evsel__read_on_cpu()
1423 perf_evsel__compute_deltas(evsel, cpu, thread, &count); in __perf_evsel__read_on_cpu()
1425 *perf_counts(evsel->counts, cpu, thread) = count; in __perf_evsel__read_on_cpu()
1429 static int get_group_fd(struct evsel *evsel, int cpu, int thread) in get_group_fd() argument
1431 struct evsel *leader = evsel->leader; in get_group_fd()
1434 if (perf_evsel__is_group_leader(evsel)) in get_group_fd()
1449 static void perf_evsel__remove_fd(struct evsel *pos, in perf_evsel__remove_fd()
1458 static int update_fds(struct evsel *evsel, in update_fds() argument
1462 struct evsel *pos; in update_fds()
1467 evlist__for_each_entry(evsel->evlist, pos) { in update_fds()
1468 nr_cpus = pos != evsel ? nr_cpus : cpu_idx; in update_fds()
1476 if (pos == evsel) in update_fds()
1482 static bool ignore_missing_thread(struct evsel *evsel, in ignore_missing_thread() argument
1489 if (!evsel->ignore_missing_thread) in ignore_missing_thread()
1493 if (evsel->core.system_wide) in ignore_missing_thread()
1508 if (update_fds(evsel, nr_cpus, cpu, threads->nr, thread)) in ignore_missing_thread()
1535 static int perf_event_open(struct evsel *evsel, in perf_event_open() argument
1539 int precise_ip = evsel->core.attr.precise_ip; in perf_event_open()
1546 fd = sys_perf_event_open(&evsel->core.attr, pid, cpu, group_fd, flags); in perf_event_open()
1551 if (!evsel->precise_max) in perf_event_open()
1558 if (!evsel->core.attr.precise_ip) { in perf_event_open()
1559 evsel->core.attr.precise_ip = precise_ip; in perf_event_open()
1564 evsel->core.attr.precise_ip--; in perf_event_open()
1565 pr_debug2("decreasing precise_ip by one (%d)\n", evsel->core.attr.precise_ip); in perf_event_open()
1566 display_attr(&evsel->core.attr); in perf_event_open()
1572 int evsel__open(struct evsel *evsel, struct perf_cpu_map *cpus, in evsel__open() argument
1580 if ((perf_missing_features.write_backward && evsel->core.attr.write_backward) || in evsel__open()
1581 (perf_missing_features.aux_output && evsel->core.attr.aux_output)) in evsel__open()
1608 if (evsel->core.system_wide) in evsel__open()
1613 if (evsel->core.fd == NULL && in evsel__open()
1614 perf_evsel__alloc_fd(&evsel->core, cpus->nr, nthreads) < 0) in evsel__open()
1617 if (evsel->cgrp) { in evsel__open()
1619 pid = evsel->cgrp->fd; in evsel__open()
1624 evsel->core.attr.clockid = CLOCK_MONOTONIC; /* should always work */ in evsel__open()
1626 evsel->core.attr.use_clockid = 0; in evsel__open()
1627 evsel->core.attr.clockid = 0; in evsel__open()
1632 evsel->core.attr.mmap2 = 0; in evsel__open()
1634 evsel->core.attr.exclude_guest = evsel->core.attr.exclude_host = 0; in evsel__open()
1636 evsel->core.attr.branch_sample_type &= ~(PERF_SAMPLE_BRANCH_NO_FLAGS | in evsel__open()
1638 if (perf_missing_features.group_read && evsel->core.attr.inherit) in evsel__open()
1639 evsel->core.attr.read_format &= ~(PERF_FORMAT_GROUP|PERF_FORMAT_ID); in evsel__open()
1641 evsel->core.attr.ksymbol = 0; in evsel__open()
1643 evsel->core.attr.bpf_event = 0; in evsel__open()
1646 evsel->core.attr.sample_id_all = 0; in evsel__open()
1648 display_attr(&evsel->core.attr); in evsel__open()
1655 if (!evsel->cgrp && !evsel->core.system_wide) in evsel__open()
1658 group_fd = get_group_fd(evsel, cpu, thread); in evsel__open()
1662 fd = perf_event_open(evsel, pid, cpus->map[cpu], in evsel__open()
1665 FD(evsel, cpu, thread) = fd; in evsel__open()
1670 if (ignore_missing_thread(evsel, cpus->nr, cpu, threads, thread, err)) { in evsel__open()
1691 if (evsel->bpf_fd >= 0) { in evsel__open()
1693 int bpf_fd = evsel->bpf_fd; in evsel__open()
1755 if (!perf_missing_features.aux_output && evsel->core.attr.aux_output) { in evsel__open()
1759 } else if (!perf_missing_features.bpf && evsel->core.attr.bpf_event) { in evsel__open()
1763 } else if (!perf_missing_features.ksymbol && evsel->core.attr.ksymbol) { in evsel__open()
1767 } else if (!perf_missing_features.write_backward && evsel->core.attr.write_backward) { in evsel__open()
1771 } else if (!perf_missing_features.clockid_wrong && evsel->core.attr.use_clockid) { in evsel__open()
1775 } else if (!perf_missing_features.clockid && evsel->core.attr.use_clockid) { in evsel__open()
1783 } else if (!perf_missing_features.mmap2 && evsel->core.attr.mmap2) { in evsel__open()
1788 (evsel->core.attr.exclude_guest || evsel->core.attr.exclude_host)) { in evsel__open()
1797 (evsel->core.attr.branch_sample_type & in evsel__open()
1804 evsel->core.attr.inherit && in evsel__open()
1805 (evsel->core.attr.read_format & PERF_FORMAT_GROUP) && in evsel__open()
1806 perf_evsel__is_group_leader(evsel)) { in evsel__open()
1817 close(FD(evsel, cpu, thread)); in evsel__open()
1818 FD(evsel, cpu, thread) = -1; in evsel__open()
1825 void evsel__close(struct evsel *evsel) in evsel__close() argument
1827 perf_evsel__close(&evsel->core); in evsel__close()
1828 perf_evsel__free_id(&evsel->core); in evsel__close()
1831 int perf_evsel__open_per_cpu(struct evsel *evsel, in perf_evsel__open_per_cpu() argument
1834 return evsel__open(evsel, cpus, NULL); in perf_evsel__open_per_cpu()
1837 int perf_evsel__open_per_thread(struct evsel *evsel, in perf_evsel__open_per_thread() argument
1840 return evsel__open(evsel, NULL, threads); in perf_evsel__open_per_thread()
1843 static int perf_evsel__parse_id_sample(const struct evsel *evsel, in perf_evsel__parse_id_sample() argument
1847 u64 type = evsel->core.attr.sample_type; in perf_evsel__parse_id_sample()
1849 bool swapped = evsel->needs_swap; in perf_evsel__parse_id_sample()
1933 int perf_evsel__parse_sample(struct evsel *evsel, union perf_event *event, in perf_evsel__parse_sample() argument
1936 u64 type = evsel->core.attr.sample_type; in perf_evsel__parse_sample()
1937 bool swapped = evsel->needs_swap; in perf_evsel__parse_sample()
1952 data->period = evsel->core.attr.sample_period; in perf_evsel__parse_sample()
1959 if (!evsel->core.attr.sample_id_all) in perf_evsel__parse_sample()
1961 return perf_evsel__parse_id_sample(evsel, event, data); in perf_evsel__parse_sample()
1966 if (perf_event__check_size(event, evsel->sample_size)) in perf_evsel__parse_sample()
2032 u64 read_format = evsel->core.attr.read_format; in perf_evsel__parse_sample()
2074 if (evsel__has_callchain(evsel)) { in perf_evsel__parse_sample()
2137 u64 mask = evsel->core.attr.sample_regs_user; in perf_evsel__parse_sample()
2193 u64 mask = evsel->core.attr.sample_regs_intr; in perf_evsel__parse_sample()
2212 int perf_evsel__parse_sample_timestamp(struct evsel *evsel, in perf_evsel__parse_sample_timestamp() argument
2216 u64 type = evsel->core.attr.sample_type; in perf_evsel__parse_sample_timestamp()
2227 if (!evsel->core.attr.sample_id_all) in perf_evsel__parse_sample_timestamp()
2229 if (perf_evsel__parse_id_sample(evsel, event, &data)) in perf_evsel__parse_sample_timestamp()
2238 if (perf_event__check_size(event, evsel->sample_size)) in perf_evsel__parse_sample_timestamp()
2256 struct tep_format_field *perf_evsel__field(struct evsel *evsel, const char *name) in perf_evsel__field() argument
2258 return tep_find_field(evsel->tp_format, name); in perf_evsel__field()
2261 void *perf_evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, in perf_evsel__rawptr() argument
2264 struct tep_format_field *field = perf_evsel__field(evsel, name); in perf_evsel__rawptr()
2319 u64 perf_evsel__intval(struct evsel *evsel, struct perf_sample *sample, in perf_evsel__intval() argument
2322 struct tep_format_field *field = perf_evsel__field(evsel, name); in perf_evsel__intval()
2327 return field ? format_field__intval(field, sample, evsel->needs_swap) : 0; in perf_evsel__intval()
2330 bool perf_evsel__fallback(struct evsel *evsel, int err, in perf_evsel__fallback() argument
2336 evsel->core.attr.type == PERF_TYPE_HARDWARE && in perf_evsel__fallback()
2337 evsel->core.attr.config == PERF_COUNT_HW_CPU_CYCLES) { in perf_evsel__fallback()
2349 evsel->core.attr.type = PERF_TYPE_SOFTWARE; in perf_evsel__fallback()
2350 evsel->core.attr.config = PERF_COUNT_SW_CPU_CLOCK; in perf_evsel__fallback()
2352 zfree(&evsel->name); in perf_evsel__fallback()
2354 } else if (err == EACCES && !evsel->core.attr.exclude_kernel && in perf_evsel__fallback()
2356 const char *name = perf_evsel__name(evsel); in perf_evsel__fallback()
2368 if (evsel->name) in perf_evsel__fallback()
2369 free(evsel->name); in perf_evsel__fallback()
2370 evsel->name = new_name; in perf_evsel__fallback()
2374 evsel->core.attr.exclude_kernel = 1; in perf_evsel__fallback()
2375 evsel->core.attr.exclude_hv = 1; in perf_evsel__fallback()
2419 int perf_evsel__open_strerror(struct evsel *evsel, struct target *target, in perf_evsel__open_strerror() argument
2431 perf_evsel__name(evsel)); in perf_evsel__open_strerror()
2451 perf_evsel__name(evsel)); in perf_evsel__open_strerror()
2459 if (evsel__has_callchain(evsel) && in perf_evsel__open_strerror()
2472 if (evsel->core.attr.sample_period != 0) in perf_evsel__open_strerror()
2475 perf_evsel__name(evsel)); in perf_evsel__open_strerror()
2476 if (evsel->core.attr.precise_ip) in perf_evsel__open_strerror()
2480 if (evsel->core.attr.type == PERF_TYPE_HARDWARE) in perf_evsel__open_strerror()
2492 if (evsel->core.attr.write_backward && perf_missing_features.write_backward) in perf_evsel__open_strerror()
2509 perf_evsel__name(evsel)); in perf_evsel__open_strerror()
2512 struct perf_env *perf_evsel__env(struct evsel *evsel) in perf_evsel__env() argument
2514 if (evsel && evsel->evlist) in perf_evsel__env()
2515 return evsel->evlist->env; in perf_evsel__env()
2519 static int store_evsel_ids(struct evsel *evsel, struct evlist *evlist) in store_evsel_ids() argument
2523 for (cpu = 0; cpu < xyarray__max_x(evsel->core.fd); cpu++) { in store_evsel_ids()
2524 for (thread = 0; thread < xyarray__max_y(evsel->core.fd); in store_evsel_ids()
2526 int fd = FD(evsel, cpu, thread); in store_evsel_ids()
2528 if (perf_evlist__id_add_fd(&evlist->core, &evsel->core, in store_evsel_ids()
2537 int perf_evsel__store_ids(struct evsel *evsel, struct evlist *evlist) in perf_evsel__store_ids() argument
2539 struct perf_cpu_map *cpus = evsel->core.cpus; in perf_evsel__store_ids()
2540 struct perf_thread_map *threads = evsel->core.threads; in perf_evsel__store_ids()
2542 if (perf_evsel__alloc_id(&evsel->core, cpus->nr, threads->nr)) in perf_evsel__store_ids()
2545 return store_evsel_ids(evsel, evlist); in perf_evsel__store_ids()