Lines Matching full:pmu

22 #include "pmu.h"
28 #include <util/pmu-bison.h>
29 #include <util/pmu-flex.h>
43 /* An event loaded from /sys/bus/event_source/devices/<pmu>/events. */
48 * An event loaded from a /sys/bus/event_source/devices/<pmu>/identifier matched json
56 * pmu-events.c, created by parsing the pmu-events json files.
74 * differ from the PMU name as it won't have suffixes.
135 static int pmu_aliases_parse(struct perf_pmu *pmu);
178 static void perf_pmu_format__load(const struct perf_pmu *pmu, struct perf_pmu_format *format) in perf_pmu_format__load() argument
186 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, "format")) in perf_pmu_format__load()
204 static int perf_pmu__format_parse(struct perf_pmu *pmu, int dirfd, bool eager_load) in perf_pmu__format_parse() argument
219 format = perf_pmu__new_format(&pmu->format, name); in perf_pmu__format_parse()
248 * Reading/parsing the default pmu format definition, which should be
252 static int pmu_format(struct perf_pmu *pmu, int dirfd, const char *name, bool eager_load) in pmu_format() argument
261 if (perf_pmu__format_parse(pmu, fd, eager_load)) in pmu_format()
309 static int perf_pmu__parse_scale(struct perf_pmu *pmu, struct perf_pmu_alias *alias) in perf_pmu__parse_scale() argument
321 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.scale", pmu->name, alias->name); in perf_pmu__parse_scale()
345 static int perf_pmu__parse_unit(struct perf_pmu *pmu, struct perf_pmu_alias *alias) in perf_pmu__parse_unit() argument
356 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.unit", pmu->name, alias->name); in perf_pmu__parse_unit()
411 static void perf_pmu__parse_per_pkg(struct perf_pmu *pmu, struct perf_pmu_alias *alias) in perf_pmu__parse_per_pkg() argument
413 alias->per_pkg = perf_pmu__parse_event_source_bool(pmu->name, alias->name, "per-pkg"); in perf_pmu__parse_per_pkg()
416 static void perf_pmu__parse_snapshot(struct perf_pmu *pmu, struct perf_pmu_alias *alias) in perf_pmu__parse_snapshot() argument
418 alias->snapshot = perf_pmu__parse_event_source_bool(pmu->name, alias->name, "snapshot"); in perf_pmu__parse_snapshot()
436 static void perf_pmu__del_aliases(struct perf_pmu *pmu) in perf_pmu__del_aliases() argument
441 if (!pmu->aliases) in perf_pmu__del_aliases()
444 hashmap__for_each_entry(pmu->aliases, entry, bkt) in perf_pmu__del_aliases()
447 hashmap__free(pmu->aliases); in perf_pmu__del_aliases()
448 pmu->aliases = NULL; in perf_pmu__del_aliases()
451 static struct perf_pmu_alias *perf_pmu__find_alias(struct perf_pmu *pmu, in perf_pmu__find_alias() argument
459 if (hashmap__find(pmu->aliases, name, &alias)) in perf_pmu__find_alias()
462 if (!load || pmu->sysfs_aliases_loaded) in perf_pmu__find_alias()
466 * Test if alias/event 'name' exists in the PMU's sysfs/events in perf_pmu__find_alias()
474 has_sysfs_event = perf_pmu__file_exists(pmu, event_file_name); in perf_pmu__find_alias()
479 has_sysfs_event = perf_pmu__file_exists(pmu, event_file_name); in perf_pmu__find_alias()
482 pmu_aliases_parse(pmu); in perf_pmu__find_alias()
483 if (hashmap__find(pmu->aliases, name, &alias)) in perf_pmu__find_alias()
508 static void read_alias_info(struct perf_pmu *pmu, struct perf_pmu_alias *alias) in read_alias_info() argument
516 perf_pmu__parse_unit(pmu, alias); in read_alias_info()
517 perf_pmu__parse_scale(pmu, alias); in read_alias_info()
518 perf_pmu__parse_per_pkg(pmu, alias); in read_alias_info()
519 perf_pmu__parse_snapshot(pmu, alias); in read_alias_info()
523 struct perf_pmu *pmu; member
534 read_alias_info(data->pmu, data->alias); in update_alias()
565 static int perf_pmu__new_alias(struct perf_pmu *pmu, const char *name, in perf_pmu__new_alias() argument
574 if (perf_pmu__find_alias(pmu, name, /*load=*/ false)) { in perf_pmu__new_alias()
585 if (pe->pmu && strcmp(pe->pmu, "default_core")) in perf_pmu__new_alias()
586 pmu_name = pe->pmu; in perf_pmu__new_alias()
641 if (pmu->events_table) { in perf_pmu__new_alias()
644 .pmu = pmu, in perf_pmu__new_alias()
647 if (pmu_events_table__find_event(pmu->events_table, pmu, name, in perf_pmu__new_alias()
649 pmu->cpu_common_json_aliases++; in perf_pmu__new_alias()
651 pmu->sysfs_aliases++; in perf_pmu__new_alias()
654 pmu->cpu_json_aliases++; in perf_pmu__new_alias()
657 pmu->sys_json_aliases++; in perf_pmu__new_alias()
661 hashmap__set(pmu->aliases, alias->name, alias, /*old_key=*/ NULL, &old_alias); in perf_pmu__new_alias()
684 * Reading the pmu event aliases definition, which should be located at:
687 static int __pmu_aliases_parse(struct perf_pmu *pmu, int events_dir_fd) in __pmu_aliases_parse() argument
719 if (perf_pmu__new_alias(pmu, name, /*desc=*/ NULL, in __pmu_aliases_parse()
726 pmu->sysfs_aliases_loaded = true; in __pmu_aliases_parse()
730 static int pmu_aliases_parse(struct perf_pmu *pmu) in pmu_aliases_parse() argument
736 if (pmu->sysfs_aliases_loaded) in pmu_aliases_parse()
742 scnprintf(path + len, sizeof(path) - len, "%s/events", pmu->name); in pmu_aliases_parse()
746 pmu->sysfs_aliases_loaded = true; in pmu_aliases_parse()
749 ret = __pmu_aliases_parse(pmu, events_dir_fd); in pmu_aliases_parse()
754 static int pmu_aliases_parse_eager(struct perf_pmu *pmu, int sysfs_fd) in pmu_aliases_parse_eager() argument
759 scnprintf(path, sizeof(path), "%s/events", pmu->name); in pmu_aliases_parse_eager()
762 pmu->sysfs_aliases_loaded = true; in pmu_aliases_parse_eager()
765 ret = __pmu_aliases_parse(pmu, events_dir_fd); in pmu_aliases_parse_eager()
865 * is_sysfs_pmu_core() - PMU CORE devices have different name other than cpu in
869 * @name: The PMU name such as "cpu_atom".
881 * Return the length of the PMU name not including the suffix for uncore PMUs.
889 static size_t pmu_deduped_name_len(const struct perf_pmu *pmu, const char *name, in pmu_deduped_name_len() argument
892 return skip_duplicate_pmus && !pmu->is_core in pmu_deduped_name_len()
971 * perf_pmu__match_wildcard_uncore - does to_match match the PMU's name?
972 * @pmu_name: The pmu->name or pmu->alias to match against.
993 /* Process comma separated list of PMU name components. */ in perf_pmu__match_wildcard_uncore()
1046 struct perf_pmu *pmu = vdata; in pmu_add_cpu_aliases_map_callback() local
1048 perf_pmu__new_alias(pmu, pe->name, pe->desc, pe->event, /*val_fd=*/ NULL, in pmu_add_cpu_aliases_map_callback()
1055 * PMU and add them to the list 'head'.
1057 void pmu_add_cpu_aliases_table(struct perf_pmu *pmu, const struct pmu_events_table *table) in pmu_add_cpu_aliases_table() argument
1059 pmu_events_table__for_each_event(table, pmu, pmu_add_cpu_aliases_map_callback, pmu); in pmu_add_cpu_aliases_table()
1062 static void pmu_add_cpu_aliases(struct perf_pmu *pmu) in pmu_add_cpu_aliases() argument
1064 if (!pmu->events_table) in pmu_add_cpu_aliases()
1067 if (pmu->cpu_aliases_added) in pmu_add_cpu_aliases()
1070 pmu_add_cpu_aliases_table(pmu, pmu->events_table); in pmu_add_cpu_aliases()
1071 pmu->cpu_aliases_added = true; in pmu_add_cpu_aliases()
1078 struct perf_pmu *pmu = vdata; in pmu_add_sys_aliases_iter_fn() local
1080 if (!pe->compat || !pe->pmu) { in pmu_add_sys_aliases_iter_fn()
1085 if (!perf_pmu__match_wildcard_uncore(pmu->name, pe->pmu) && in pmu_add_sys_aliases_iter_fn()
1086 !perf_pmu__match_wildcard_uncore(pmu->alias_name, pe->pmu)) { in pmu_add_sys_aliases_iter_fn()
1087 /* PMU name/alias_name don't match. */ in pmu_add_sys_aliases_iter_fn()
1091 if (pmu_uncore_identifier_match(pe->compat, pmu->id)) { in pmu_add_sys_aliases_iter_fn()
1093 perf_pmu__new_alias(pmu, in pmu_add_sys_aliases_iter_fn()
1104 void pmu_add_sys_aliases(struct perf_pmu *pmu) in pmu_add_sys_aliases() argument
1106 if (!pmu->id) in pmu_add_sys_aliases()
1109 pmu_for_each_sys_event(pmu_add_sys_aliases_iter_fn, pmu); in pmu_add_sys_aliases()
1112 static char *pmu_find_alias_name(struct perf_pmu *pmu, int dirfd) in pmu_find_alias_name() argument
1114 FILE *file = perf_pmu__open_file_at(pmu, dirfd, "alias"); in pmu_find_alias_name()
1135 static int pmu_max_precise(int dirfd, struct perf_pmu *pmu) in pmu_max_precise() argument
1139 perf_pmu__scan_file_at(pmu, dirfd, "caps/max_precise", "%d", &max_precise); in pmu_max_precise()
1144 perf_pmu__arch_init(struct perf_pmu *pmu) in perf_pmu__arch_init() argument
1146 if (pmu->is_core) in perf_pmu__arch_init()
1147 pmu->mem_events = perf_mem_events; in perf_pmu__arch_init()
1168 int perf_pmu__init(struct perf_pmu *pmu, __u32 type, const char *name) in perf_pmu__init() argument
1170 pmu->type = type; in perf_pmu__init()
1171 INIT_LIST_HEAD(&pmu->format); in perf_pmu__init()
1172 INIT_LIST_HEAD(&pmu->caps); in perf_pmu__init()
1174 pmu->name = strdup(name); in perf_pmu__init()
1175 if (!pmu->name) in perf_pmu__init()
1178 pmu->aliases = hashmap__new(aliases__hash, aliases__equal, /*ctx=*/ NULL); in perf_pmu__init()
1179 if (!pmu->aliases) in perf_pmu__init()
1214 struct perf_pmu *pmu; in perf_pmu__lookup() local
1216 pmu = zalloc(sizeof(*pmu)); in perf_pmu__lookup()
1217 if (!pmu) in perf_pmu__lookup()
1220 if (perf_pmu__init(pmu, PERF_PMU_TYPE_FAKE, name) != 0) { in perf_pmu__lookup()
1221 perf_pmu__delete(pmu); in perf_pmu__lookup()
1226 * Read type early to fail fast if a lookup name isn't a PMU. Ensure in perf_pmu__lookup()
1229 if (perf_pmu__scan_file_at(pmu, dirfd, "type", "%u", &pmu->type) != 1) { in perf_pmu__lookup()
1230 /* Double check the PMU's name isn't wellknown. */ in perf_pmu__lookup()
1231 pmu->type = wellknown_pmu_type(name); in perf_pmu__lookup()
1232 if (pmu->type == PERF_TYPE_MAX) { in perf_pmu__lookup()
1233 perf_pmu__delete(pmu); in perf_pmu__lookup()
1239 * The pmu data we store & need consists of the pmu in perf_pmu__lookup()
1243 if (pmu_format(pmu, dirfd, name, eager_load)) { in perf_pmu__lookup()
1244 perf_pmu__delete(pmu); in perf_pmu__lookup()
1248 pmu->is_core = is_pmu_core(name); in perf_pmu__lookup()
1249 pmu->cpus = pmu_cpumask(dirfd, name, pmu->is_core); in perf_pmu__lookup()
1251 pmu->is_uncore = pmu_is_uncore(dirfd, name); in perf_pmu__lookup()
1252 if (pmu->is_uncore) in perf_pmu__lookup()
1253 pmu->id = pmu_id(name); in perf_pmu__lookup()
1254 pmu->max_precise = pmu_max_precise(dirfd, pmu); in perf_pmu__lookup()
1255 pmu->alias_name = pmu_find_alias_name(pmu, dirfd); in perf_pmu__lookup()
1256 pmu->events_table = perf_pmu__find_events_table(pmu); in perf_pmu__lookup()
1258 * Load the sys json events/aliases when loading the PMU as each event in perf_pmu__lookup()
1263 pmu_add_sys_aliases(pmu); in perf_pmu__lookup()
1264 list_add_tail(&pmu->list, pmus); in perf_pmu__lookup()
1266 perf_pmu__arch_init(pmu); in perf_pmu__lookup()
1269 pmu_aliases_parse_eager(pmu, dirfd); in perf_pmu__lookup()
1271 return pmu; in perf_pmu__lookup()
1274 /* Creates the PMU when sysfs scanning fails. */
1277 struct perf_pmu *pmu = zalloc(sizeof(*pmu)); in perf_pmu__create_placeholder_core_pmu() local
1279 if (!pmu) in perf_pmu__create_placeholder_core_pmu()
1282 pmu->name = strdup("cpu"); in perf_pmu__create_placeholder_core_pmu()
1283 if (!pmu->name) { in perf_pmu__create_placeholder_core_pmu()
1284 free(pmu); in perf_pmu__create_placeholder_core_pmu()
1288 pmu->is_core = true; in perf_pmu__create_placeholder_core_pmu()
1289 pmu->type = PERF_TYPE_RAW; in perf_pmu__create_placeholder_core_pmu()
1290 pmu->cpus = cpu_map__online(); in perf_pmu__create_placeholder_core_pmu()
1292 INIT_LIST_HEAD(&pmu->format); in perf_pmu__create_placeholder_core_pmu()
1293 pmu->aliases = hashmap__new(aliases__hash, aliases__equal, /*ctx=*/ NULL); in perf_pmu__create_placeholder_core_pmu()
1294 INIT_LIST_HEAD(&pmu->caps); in perf_pmu__create_placeholder_core_pmu()
1295 list_add_tail(&pmu->list, core_pmus); in perf_pmu__create_placeholder_core_pmu()
1296 return pmu; in perf_pmu__create_placeholder_core_pmu()
1299 bool perf_pmu__is_fake(const struct perf_pmu *pmu) in perf_pmu__is_fake() argument
1301 return pmu->type == PERF_PMU_TYPE_FAKE; in perf_pmu__is_fake()
1304 void perf_pmu__warn_invalid_formats(struct perf_pmu *pmu) in perf_pmu__warn_invalid_formats() argument
1308 if (pmu->formats_checked) in perf_pmu__warn_invalid_formats()
1311 pmu->formats_checked = true; in perf_pmu__warn_invalid_formats()
1313 /* fake pmu doesn't have format list */ in perf_pmu__warn_invalid_formats()
1314 if (perf_pmu__is_fake(pmu)) in perf_pmu__warn_invalid_formats()
1317 list_for_each_entry(format, &pmu->format, list) { in perf_pmu__warn_invalid_formats()
1318 perf_pmu_format__load(pmu, format); in perf_pmu__warn_invalid_formats()
1322 pmu->name, format->name, format->value); in perf_pmu__warn_invalid_formats()
1330 struct perf_pmu *pmu; in evsel__is_aux_event() local
1335 pmu = evsel__find_pmu(evsel); in evsel__is_aux_event()
1336 return pmu && pmu->auxtrace; in evsel__is_aux_event()
1348 void evsel__set_config_if_unset(struct perf_pmu *pmu, struct evsel *evsel, in evsel__set_config_if_unset() argument
1357 bits = perf_pmu__format_bits(pmu, config_name); in evsel__set_config_if_unset()
1380 __u64 perf_pmu__format_bits(struct perf_pmu *pmu, const char *name) in perf_pmu__format_bits() argument
1382 struct perf_pmu_format *format = pmu_find_format(&pmu->format, name); in perf_pmu__format_bits()
1395 int perf_pmu__format_type(struct perf_pmu *pmu, const char *name) in perf_pmu__format_type() argument
1397 struct perf_pmu_format *format = pmu_find_format(&pmu->format, name); in perf_pmu__format_type()
1402 perf_pmu_format__load(pmu, format); in perf_pmu__format_type()
1493 static int pmu_config_term(const struct perf_pmu *pmu, in pmu_config_term() argument
1513 * traditionally have had to handle not having a PMU. An alias may in pmu_config_term()
1553 format = pmu_find_format(&pmu->format, term->config); in pmu_config_term()
1555 char *pmu_term = pmu_formats_string(&pmu->format); in pmu_config_term()
1560 "unknown term '%s' for pmu '%s'", in pmu_config_term()
1561 term->config, pmu->name) < 0) in pmu_config_term()
1575 perf_pmu_format__load(pmu, format); in pmu_config_term()
1651 int perf_pmu__config_terms(const struct perf_pmu *pmu, in perf_pmu__config_terms() argument
1659 if (perf_pmu__is_hwmon(pmu)) in perf_pmu__config_terms()
1660 return hwmon_pmu__config_terms(pmu, attr, terms, err); in perf_pmu__config_terms()
1661 if (perf_pmu__is_drm(pmu)) in perf_pmu__config_terms()
1662 return drm_pmu__config_terms(pmu, attr, terms, err); in perf_pmu__config_terms()
1665 if (pmu_config_term(pmu, attr, term, terms, zero, apply_hardcoded, err)) in perf_pmu__config_terms()
1675 * 2) pmu format definitions - specified by pmu parameter
1677 int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr, in perf_pmu__config() argument
1682 bool zero = !!pmu->perf_event_attr_init_default; in perf_pmu__config()
1684 /* Fake PMU doesn't have proper terms so nothing to configure in attr. */ in perf_pmu__config()
1685 if (perf_pmu__is_fake(pmu)) in perf_pmu__config()
1688 return perf_pmu__config_terms(pmu, attr, head_terms, zero, apply_hardcoded, err); in perf_pmu__config()
1691 static struct perf_pmu_alias *pmu_find_alias(struct perf_pmu *pmu, in pmu_find_alias() argument
1703 if (pmu_find_format(&pmu->format, term->config)) in pmu_find_alias()
1715 alias = perf_pmu__find_alias(pmu, name, /*load=*/ true); in pmu_find_alias()
1716 if (alias || pmu->cpu_aliases_added) in pmu_find_alias()
1720 if (pmu->events_table && in pmu_find_alias()
1721 pmu_events_table__find_event(pmu->events_table, pmu, name, in pmu_find_alias()
1723 pmu) == 0) { in pmu_find_alias()
1724 alias = perf_pmu__find_alias(pmu, name, /*load=*/ false); in pmu_find_alias()
1730 static int check_info_data(struct perf_pmu *pmu, in check_info_data() argument
1736 read_alias_info(pmu, alias); in check_info_data()
1777 int perf_pmu__check_alias(struct perf_pmu *pmu, struct parse_events_terms *head_terms, in perf_pmu__check_alias() argument
1799 if (perf_pmu__is_hwmon(pmu)) { in perf_pmu__check_alias()
1803 if (perf_pmu__is_drm(pmu)) { in perf_pmu__check_alias()
1804 ret = drm_pmu__check_alias(pmu, head_terms, info, err); in perf_pmu__check_alias()
1808 /* Fake PMU doesn't rewrite terms. */ in perf_pmu__check_alias()
1809 if (perf_pmu__is_fake(pmu)) in perf_pmu__check_alias()
1813 alias = pmu_find_alias(pmu, term); in perf_pmu__check_alias()
1825 ret = check_info_data(pmu, alias, info, err, term->err_term); in perf_pmu__check_alias()
1873 int perf_pmu__find_event(struct perf_pmu *pmu, const char *event, void *state, pmu_event_callback c… in perf_pmu__find_event() argument
1882 return perf_pmu__for_each_event(pmu, /*skip_duplicate_pmus=*/ false, in perf_pmu__find_event()
1897 bool perf_pmu__has_format(const struct perf_pmu *pmu, const char *name) in perf_pmu__has_format() argument
1901 list_for_each_entry(format, &pmu->format, list) { in perf_pmu__has_format()
1908 int perf_pmu__for_each_format(struct perf_pmu *pmu, void *state, pmu_format_callback cb) in perf_pmu__for_each_format() argument
1945 list_for_each_entry(format, &pmu->format, list) { in perf_pmu__for_each_format()
1946 perf_pmu_format__load(pmu, format); in perf_pmu__for_each_format()
1951 if (!pmu->is_core) in perf_pmu__for_each_format()
1972 bool perf_pmu__supports_legacy_cache(const struct perf_pmu *pmu) in perf_pmu__supports_legacy_cache() argument
1974 return pmu->is_core; in perf_pmu__supports_legacy_cache()
1977 bool perf_pmu__auto_merge_stats(const struct perf_pmu *pmu) in perf_pmu__auto_merge_stats() argument
1979 return !pmu->is_core || perf_pmus__num_core_pmus() == 1; in perf_pmu__auto_merge_stats()
1982 bool perf_pmu__have_event(struct perf_pmu *pmu, const char *name) in perf_pmu__have_event() argument
1986 if (perf_pmu__is_tool(pmu) && tool_pmu__skip_event(name)) in perf_pmu__have_event()
1988 if (perf_pmu__is_tracepoint(pmu)) in perf_pmu__have_event()
1989 return tp_pmu__have_event(pmu, name); in perf_pmu__have_event()
1990 if (perf_pmu__is_hwmon(pmu)) in perf_pmu__have_event()
1991 return hwmon_pmu__have_event(pmu, name); in perf_pmu__have_event()
1992 if (perf_pmu__is_drm(pmu)) in perf_pmu__have_event()
1993 return drm_pmu__have_event(pmu, name); in perf_pmu__have_event()
1994 if (perf_pmu__find_alias(pmu, name, /*load=*/ true) != NULL) in perf_pmu__have_event()
1996 if (pmu->cpu_aliases_added || !pmu->events_table) in perf_pmu__have_event()
1998 return pmu_events_table__find_event(pmu->events_table, pmu, name, NULL, NULL) == 0; in perf_pmu__have_event()
2001 size_t perf_pmu__num_events(struct perf_pmu *pmu) in perf_pmu__num_events() argument
2005 if (perf_pmu__is_tracepoint(pmu)) in perf_pmu__num_events()
2006 return tp_pmu__num_events(pmu); in perf_pmu__num_events()
2007 if (perf_pmu__is_hwmon(pmu)) in perf_pmu__num_events()
2008 return hwmon_pmu__num_events(pmu); in perf_pmu__num_events()
2009 if (perf_pmu__is_drm(pmu)) in perf_pmu__num_events()
2010 return drm_pmu__num_events(pmu); in perf_pmu__num_events()
2012 pmu_aliases_parse(pmu); in perf_pmu__num_events()
2013 nr = pmu->sysfs_aliases + pmu->sys_json_aliases; in perf_pmu__num_events()
2015 if (pmu->cpu_aliases_added) in perf_pmu__num_events()
2016 nr += pmu->cpu_json_aliases; in perf_pmu__num_events()
2017 else if (pmu->events_table) in perf_pmu__num_events()
2018 nr += pmu_events_table__num_events(pmu->events_table, pmu) - in perf_pmu__num_events()
2019 pmu->cpu_common_json_aliases; in perf_pmu__num_events()
2021 assert(pmu->cpu_json_aliases == 0 && pmu->cpu_common_json_aliases == 0); in perf_pmu__num_events()
2023 if (perf_pmu__is_tool(pmu)) in perf_pmu__num_events()
2026 return pmu->selectable ? nr + 1 : nr; in perf_pmu__num_events()
2036 static char *format_alias(char *buf, int len, const struct perf_pmu *pmu, in format_alias() argument
2040 size_t pmu_name_len = pmu_deduped_name_len(pmu, pmu->name, in format_alias()
2042 int used = snprintf(buf, len, "%.*s/%s", (int)pmu_name_len, pmu->name, alias->name); in format_alias()
2064 int perf_pmu__for_each_event(struct perf_pmu *pmu, bool skip_duplicate_pmus, in perf_pmu__for_each_event() argument
2069 .pmu = pmu, in perf_pmu__for_each_event()
2070 .event_type_desc = "Kernel PMU event", in perf_pmu__for_each_event()
2077 if (perf_pmu__is_tracepoint(pmu)) in perf_pmu__for_each_event()
2078 return tp_pmu__for_each_event(pmu, state, cb); in perf_pmu__for_each_event()
2079 if (perf_pmu__is_hwmon(pmu)) in perf_pmu__for_each_event()
2080 return hwmon_pmu__for_each_event(pmu, state, cb); in perf_pmu__for_each_event()
2081 if (perf_pmu__is_drm(pmu)) in perf_pmu__for_each_event()
2082 return drm_pmu__for_each_event(pmu, state, cb); in perf_pmu__for_each_event()
2085 pmu_aliases_parse(pmu); in perf_pmu__for_each_event()
2086 pmu_add_cpu_aliases(pmu); in perf_pmu__for_each_event()
2087 hashmap__for_each_entry(pmu->aliases, entry, bkt) { in perf_pmu__for_each_event()
2091 if (perf_pmu__is_tool(pmu) && tool_pmu__skip_event(event->name)) in perf_pmu__for_each_event()
2094 info.pmu_name = event->pmu_name ?: pmu->name; in perf_pmu__for_each_event()
2095 pmu_name_len = pmu_deduped_name_len(pmu, info.pmu_name, in perf_pmu__for_each_event()
2102 info.name = format_alias(buf, sizeof(buf), pmu, event, in perf_pmu__for_each_event()
2104 if (pmu->is_core) { in perf_pmu__for_each_event()
2130 if (pmu->selectable) { in perf_pmu__for_each_event()
2132 snprintf(buf, sizeof(buf), "%s//", pmu->name); in perf_pmu__for_each_event()
2139 info.pmu_name = pmu->name; in perf_pmu__for_each_event()
2148 static bool perf_pmu___name_match(const struct perf_pmu *pmu, const char *to_match, bool wildcard) in perf_pmu___name_match() argument
2151 pmu->name, in perf_pmu___name_match()
2152 pmu->alias_name, in perf_pmu___name_match()
2154 if (pmu->is_core) { in perf_pmu___name_match()
2169 * PMU as the PMU name varies across architectures. in perf_pmu___name_match()
2175 if (!pmu->is_uncore) { in perf_pmu___name_match()
2177 * PMU isn't core or uncore, some kind of broken CPU mask in perf_pmu___name_match()
2209 * if pmu matches the json to_match string.
2210 * @pmu: The pmu whose name/alias to match.
2213 bool perf_pmu__name_wildcard_match(const struct perf_pmu *pmu, const char *to_match) in perf_pmu__name_wildcard_match() argument
2215 return perf_pmu___name_match(pmu, to_match, /*wildcard=*/true); in perf_pmu__name_wildcard_match()
2219 * perf_pmu__name_no_suffix_match - Does pmu's name match to_match ignoring any
2221 * @pmu: The pmu whose name/alias to match.
2224 bool perf_pmu__name_no_suffix_match(const struct perf_pmu *pmu, const char *to_match) in perf_pmu__name_no_suffix_match() argument
2226 return perf_pmu___name_match(pmu, to_match, /*wildcard=*/false); in perf_pmu__name_no_suffix_match()
2229 bool perf_pmu__is_software(const struct perf_pmu *pmu) in perf_pmu__is_software() argument
2237 if (pmu->is_core || pmu->is_uncore || pmu->auxtrace) in perf_pmu__is_software()
2239 switch (pmu->type) { in perf_pmu__is_software()
2250 if (!strcmp(pmu->name, known_sw_pmus[i])) in perf_pmu__is_software()
2256 FILE *perf_pmu__open_file(const struct perf_pmu *pmu, const char *name) in perf_pmu__open_file() argument
2260 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, name) || in perf_pmu__open_file()
2267 FILE *perf_pmu__open_file_at(const struct perf_pmu *pmu, int dirfd, const char *name) in perf_pmu__open_file_at() argument
2271 fd = perf_pmu__pathname_fd(dirfd, pmu->name, name, O_RDONLY); in perf_pmu__open_file_at()
2278 int perf_pmu__scan_file(const struct perf_pmu *pmu, const char *name, const char *fmt, in perf_pmu__scan_file() argument
2286 file = perf_pmu__open_file(pmu, name); in perf_pmu__scan_file()
2295 int perf_pmu__scan_file_at(const struct perf_pmu *pmu, int dirfd, const char *name, in perf_pmu__scan_file_at() argument
2303 file = perf_pmu__open_file_at(pmu, dirfd, name); in perf_pmu__scan_file_at()
2312 bool perf_pmu__file_exists(const struct perf_pmu *pmu, const char *name) in perf_pmu__file_exists() argument
2316 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, name)) in perf_pmu__file_exists()
2346 static void perf_pmu__del_caps(struct perf_pmu *pmu) in perf_pmu__del_caps() argument
2350 list_for_each_entry_safe(caps, tmp, &pmu->caps, list) { in perf_pmu__del_caps()
2358 struct perf_pmu_caps *perf_pmu__get_cap(struct perf_pmu *pmu, const char *name) in perf_pmu__get_cap() argument
2362 list_for_each_entry(caps, &pmu->caps, list) { in perf_pmu__get_cap()
2370 * Reading/parsing the given pmu capabilities, which should be located at:
2374 int perf_pmu__caps_parse(struct perf_pmu *pmu) in perf_pmu__caps_parse() argument
2381 if (pmu->caps_initialized) in perf_pmu__caps_parse()
2382 return pmu->nr_caps; in perf_pmu__caps_parse()
2384 pmu->nr_caps = 0; in perf_pmu__caps_parse()
2386 if (!perf_pmu__pathname_scnprintf(caps_path, sizeof(caps_path), pmu->name, "caps")) in perf_pmu__caps_parse()
2391 pmu->caps_initialized = true; in perf_pmu__caps_parse()
2416 (perf_pmu__new_caps(&pmu->caps, name, value) < 0)) { in perf_pmu__caps_parse()
2421 pmu->nr_caps++; in perf_pmu__caps_parse()
2427 pmu->caps_initialized = true; in perf_pmu__caps_parse()
2428 return pmu->nr_caps; in perf_pmu__caps_parse()
2431 static void perf_pmu__compute_config_masks(struct perf_pmu *pmu) in perf_pmu__compute_config_masks() argument
2435 if (pmu->config_masks_computed) in perf_pmu__compute_config_masks()
2438 list_for_each_entry(format, &pmu->format, list) { in perf_pmu__compute_config_masks()
2445 pmu->config_masks_present = true; in perf_pmu__compute_config_masks()
2446 mask = &pmu->config_masks[format->value]; in perf_pmu__compute_config_masks()
2451 pmu->config_masks_computed = true; in perf_pmu__compute_config_masks()
2454 void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config, in perf_pmu__warn_invalid_config() argument
2461 perf_pmu__compute_config_masks(pmu); in perf_pmu__warn_invalid_config()
2466 if (!pmu->config_masks_present) in perf_pmu__warn_invalid_config()
2469 bits = config & ~pmu->config_masks[config_num]; in perf_pmu__warn_invalid_config()
2480 bool perf_pmu__wildcard_match(const struct perf_pmu *pmu, const char *wildcard_to_match) in perf_pmu__wildcard_match() argument
2483 pmu->name, in perf_pmu__wildcard_match()
2484 pmu->alias_name, in perf_pmu__wildcard_match()
2557 void perf_pmu__delete(struct perf_pmu *pmu) in perf_pmu__delete() argument
2559 if (!pmu) in perf_pmu__delete()
2562 if (perf_pmu__is_hwmon(pmu)) in perf_pmu__delete()
2563 hwmon_pmu__exit(pmu); in perf_pmu__delete()
2564 else if (perf_pmu__is_drm(pmu)) in perf_pmu__delete()
2565 drm_pmu__exit(pmu); in perf_pmu__delete()
2567 perf_pmu__del_formats(&pmu->format); in perf_pmu__delete()
2568 perf_pmu__del_aliases(pmu); in perf_pmu__delete()
2569 perf_pmu__del_caps(pmu); in perf_pmu__delete()
2571 perf_cpu_map__put(pmu->cpus); in perf_pmu__delete()
2573 zfree(&pmu->name); in perf_pmu__delete()
2574 zfree(&pmu->alias_name); in perf_pmu__delete()
2575 zfree(&pmu->id); in perf_pmu__delete()
2576 free(pmu); in perf_pmu__delete()
2579 const char *perf_pmu__name_from_config(struct perf_pmu *pmu, u64 config) in perf_pmu__name_from_config() argument
2584 if (!pmu) in perf_pmu__name_from_config()
2587 pmu_aliases_parse(pmu); in perf_pmu__name_from_config()
2588 pmu_add_cpu_aliases(pmu); in perf_pmu__name_from_config()
2589 hashmap__for_each_entry(pmu->aliases, entry, bkt) { in perf_pmu__name_from_config()
2593 int ret = perf_pmu__config(pmu, &attr, &event->terms, /*apply_hardcoded=*/true, in perf_pmu__name_from_config()