Lines Matching refs:pmu

20 #include "pmu.h"
22 #include <util/pmu-bison.h>
23 #include <util/pmu-flex.h>
41 * pmu-events.c, created by parsing the pmu-events json files.
116 static int pmu_aliases_parse(struct perf_pmu *pmu);
159 static void perf_pmu_format__load(const struct perf_pmu *pmu, struct perf_pmu_format *format)
167 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, "format"))
185 int perf_pmu__format_parse(struct perf_pmu *pmu, int dirfd, bool eager_load)
202 format = perf_pmu__new_format(&pmu->format, name);
231 * Reading/parsing the default pmu format definition, which should be
235 static int pmu_format(struct perf_pmu *pmu, int dirfd, const char *name)
244 if (perf_pmu__format_parse(pmu, fd, /*eager_load=*/false))
287 static int perf_pmu__parse_scale(struct perf_pmu *pmu, struct perf_pmu_alias *alias)
299 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.scale", pmu->name, alias->name);
323 static int perf_pmu__parse_unit(struct perf_pmu *pmu, struct perf_pmu_alias *alias)
334 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.unit", pmu->name, alias->name);
359 perf_pmu__parse_per_pkg(struct perf_pmu *pmu, struct perf_pmu_alias *alias)
368 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.per-pkg", pmu->name, alias->name);
380 static int perf_pmu__parse_snapshot(struct perf_pmu *pmu, struct perf_pmu_alias *alias)
389 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.snapshot", pmu->name, alias->name);
412 static void perf_pmu__del_aliases(struct perf_pmu *pmu)
416 list_for_each_entry_safe(alias, tmp, &pmu->aliases, list) {
422 static struct perf_pmu_alias *perf_pmu__find_alias(struct perf_pmu *pmu,
428 if (load && !pmu->sysfs_aliases_loaded)
429 pmu_aliases_parse(pmu);
431 list_for_each_entry(alias, &pmu->aliases, list) {
456 static void read_alias_info(struct perf_pmu *pmu, struct perf_pmu_alias *alias)
464 perf_pmu__parse_unit(pmu, alias);
465 perf_pmu__parse_scale(pmu, alias);
466 perf_pmu__parse_per_pkg(pmu, alias);
467 perf_pmu__parse_snapshot(pmu, alias);
471 struct perf_pmu *pmu;
482 read_alias_info(data->pmu, data->alias);
501 static int perf_pmu__new_alias(struct perf_pmu *pmu, const char *name,
510 if (perf_pmu__find_alias(pmu, name, /*load=*/ false)) {
521 pmu_name = pe->pmu;
558 .pmu = pmu,
563 if (pmu->events_table) {
564 if (pmu_events_table__find_event(pmu->events_table, pmu, name,
566 pmu->loaded_json_aliases++;
571 pmu->sysfs_aliases++;
573 pmu->loaded_json_aliases++;
574 list_add_tail(&alias->list, &pmu->aliases);
596 * Reading the pmu event aliases definition, which should be located at:
599 static int pmu_aliases_parse(struct perf_pmu *pmu)
610 scnprintf(path + len, sizeof(path) - len, "%s/events", pmu->name);
614 pmu->sysfs_aliases_loaded = true;
648 if (perf_pmu__new_alias(pmu, name, /*desc=*/ NULL,
656 pmu->sysfs_aliases_loaded = true;
700 struct perf_pmu pmu = {.name = pmu_name};
705 file = perf_pmu__open_file_at(&pmu, dirfd, *template);
761 char *perf_pmu__getcpuid(struct perf_pmu *pmu)
770 cpuid = get_cpuid_str(pmu);
901 struct perf_pmu *pmu = vdata;
903 perf_pmu__new_alias(pmu, pe->name, pe->desc, pe->event, /*val_fd=*/ NULL, pe);
911 void pmu_add_cpu_aliases_table(struct perf_pmu *pmu, const struct pmu_events_table *table)
913 pmu_events_table__for_each_event(table, pmu, pmu_add_cpu_aliases_map_callback, pmu);
916 static void pmu_add_cpu_aliases(struct perf_pmu *pmu)
918 if (!pmu->events_table)
921 if (pmu->cpu_aliases_added)
924 pmu_add_cpu_aliases_table(pmu, pmu->events_table);
925 pmu->cpu_aliases_added = true;
932 struct perf_pmu *pmu = vdata;
934 if (!pe->compat || !pe->pmu)
937 if (pmu_uncore_alias_match(pe->pmu, pmu->name) &&
938 pmu_uncore_identifier_match(pe->compat, pmu->id)) {
939 perf_pmu__new_alias(pmu,
950 void pmu_add_sys_aliases(struct perf_pmu *pmu)
952 if (!pmu->id)
955 pmu_for_each_sys_event(pmu_add_sys_aliases_iter_fn, pmu);
958 static char *pmu_find_alias_name(struct perf_pmu *pmu, int dirfd)
960 FILE *file = perf_pmu__open_file_at(pmu, dirfd, "alias");
981 static int pmu_max_precise(int dirfd, struct perf_pmu *pmu)
985 perf_pmu__scan_file_at(pmu, dirfd, "caps/max_precise", "%d", &max_precise);
990 perf_pmu__arch_init(struct perf_pmu *pmu)
992 if (pmu->is_core)
993 pmu->mem_events = perf_mem_events;
998 struct perf_pmu *pmu;
1001 pmu = zalloc(sizeof(*pmu));
1002 if (!pmu)
1005 pmu->name = strdup(name);
1006 if (!pmu->name)
1013 if (perf_pmu__scan_file_at(pmu, dirfd, "type", "%u", &type) != 1)
1016 INIT_LIST_HEAD(&pmu->format);
1017 INIT_LIST_HEAD(&pmu->aliases);
1018 INIT_LIST_HEAD(&pmu->caps);
1021 * The pmu data we store & need consists of the pmu
1025 if (pmu_format(pmu, dirfd, name))
1028 pmu->is_core = is_pmu_core(name);
1029 pmu->cpus = pmu_cpumask(dirfd, name, pmu->is_core);
1031 pmu->type = type;
1032 pmu->is_uncore = pmu_is_uncore(dirfd, name);
1033 if (pmu->is_uncore)
1034 pmu->id = pmu_id(name);
1035 pmu->max_precise = pmu_max_precise(dirfd, pmu);
1036 pmu->alias_name = pmu_find_alias_name(pmu, dirfd);
1037 pmu->events_table = perf_pmu__find_events_table(pmu);
1038 pmu_add_sys_aliases(pmu);
1039 list_add_tail(&pmu->list, pmus);
1041 perf_pmu__arch_init(pmu);
1043 return pmu;
1045 zfree(&pmu->name);
1046 free(pmu);
1053 struct perf_pmu *pmu = zalloc(sizeof(*pmu));
1055 if (!pmu)
1058 pmu->name = strdup("cpu");
1059 if (!pmu->name) {
1060 free(pmu);
1064 pmu->is_core = true;
1065 pmu->type = PERF_TYPE_RAW;
1066 pmu->cpus = cpu_map__online();
1068 INIT_LIST_HEAD(&pmu->format);
1069 INIT_LIST_HEAD(&pmu->aliases);
1070 INIT_LIST_HEAD(&pmu->caps);
1071 list_add_tail(&pmu->list, core_pmus);
1072 return pmu;
1075 void perf_pmu__warn_invalid_formats(struct perf_pmu *pmu)
1079 if (pmu->formats_checked)
1082 pmu->formats_checked = true;
1084 /* fake pmu doesn't have format list */
1085 if (pmu == &perf_pmu__fake)
1088 list_for_each_entry(format, &pmu->format, list) {
1089 perf_pmu_format__load(pmu, format);
1093 pmu->name, format->name, format->value);
1101 struct perf_pmu *pmu = evsel__find_pmu(evsel);
1103 return pmu && pmu->auxtrace;
1115 void evsel__set_config_if_unset(struct perf_pmu *pmu, struct evsel *evsel,
1124 bits = perf_pmu__format_bits(pmu, config_name);
1147 __u64 perf_pmu__format_bits(struct perf_pmu *pmu, const char *name)
1149 struct perf_pmu_format *format = pmu_find_format(&pmu->format, name);
1162 int perf_pmu__format_type(struct perf_pmu *pmu, const char *name)
1164 struct perf_pmu_format *format = pmu_find_format(&pmu->format, name);
1169 perf_pmu_format__load(pmu, format);
1260 static int pmu_config_term(const struct perf_pmu *pmu,
1284 format = pmu_find_format(&pmu->format, term->config);
1286 char *pmu_term = pmu_formats_string(&pmu->format);
1291 "unknown term '%s' for pmu '%s'",
1292 term->config, pmu->name) < 0)
1306 perf_pmu_format__load(pmu, format);
1383 int perf_pmu__config_terms(const struct perf_pmu *pmu,
1391 if (pmu_config_term(pmu, attr, term, terms, zero, err))
1401 * 2) pmu format definitions - specified by pmu parameter
1403 int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr,
1407 bool zero = !!pmu->perf_event_attr_init_default;
1409 return perf_pmu__config_terms(pmu, attr, head_terms, zero, err);
1412 static struct perf_pmu_alias *pmu_find_alias(struct perf_pmu *pmu,
1424 if (pmu_find_format(&pmu->format, term->config))
1436 alias = perf_pmu__find_alias(pmu, name, /*load=*/ true);
1437 if (alias || pmu->cpu_aliases_added)
1441 if (pmu->events_table &&
1442 pmu_events_table__find_event(pmu->events_table, pmu, name,
1444 pmu) == 0) {
1445 alias = perf_pmu__find_alias(pmu, name, /*load=*/ false);
1451 static int check_info_data(struct perf_pmu *pmu,
1457 read_alias_info(pmu, alias);
1498 int perf_pmu__check_alias(struct perf_pmu *pmu, struct parse_events_terms *head_terms,
1518 alias = pmu_find_alias(pmu, term);
1529 ret = check_info_data(pmu, alias, info, err, term->err_term);
1570 int perf_pmu__find_event(struct perf_pmu *pmu, const char *event, void *state, pmu_event_callback cb)
1579 return perf_pmu__for_each_event(pmu, /*skip_duplicate_pmus=*/ false,
1594 bool perf_pmu__has_format(const struct perf_pmu *pmu, const char *name)
1598 list_for_each_entry(format, &pmu->format, list) {
1610 bool perf_pmu__supports_legacy_cache(const struct perf_pmu *pmu)
1612 return pmu->is_core;
1615 bool perf_pmu__auto_merge_stats(const struct perf_pmu *pmu)
1617 return !pmu->is_core || perf_pmus__num_core_pmus() == 1;
1620 bool perf_pmu__have_event(struct perf_pmu *pmu, const char *name)
1624 if (perf_pmu__find_alias(pmu, name, /*load=*/ true) != NULL)
1626 if (pmu->cpu_aliases_added || !pmu->events_table)
1628 return pmu_events_table__find_event(pmu->events_table, pmu, name, NULL, NULL) == 0;
1631 size_t perf_pmu__num_events(struct perf_pmu *pmu)
1635 if (!pmu->sysfs_aliases_loaded)
1636 pmu_aliases_parse(pmu);
1638 nr = pmu->sysfs_aliases;
1640 if (pmu->cpu_aliases_added)
1641 nr += pmu->loaded_json_aliases;
1642 else if (pmu->events_table)
1643 nr += pmu_events_table__num_events(pmu->events_table, pmu) - pmu->loaded_json_aliases;
1645 return pmu->selectable ? nr + 1 : nr;
1655 static char *format_alias(char *buf, int len, const struct perf_pmu *pmu,
1660 ? pmu_name_len_no_suffix(pmu->name, /*num=*/NULL)
1661 : (int)strlen(pmu->name);
1662 int used = snprintf(buf, len, "%.*s/%s", pmu_name_len, pmu->name, alias->name);
1684 int perf_pmu__for_each_event(struct perf_pmu *pmu, bool skip_duplicate_pmus,
1690 .pmu = pmu,
1696 pmu_add_cpu_aliases(pmu);
1697 list_for_each_entry(event, &pmu->aliases, list) {
1700 info.pmu_name = event->pmu_name ?: pmu->name;
1706 info.name = format_alias(buf, sizeof(buf), pmu, event,
1708 if (pmu->is_core) {
1734 if (pmu->selectable) {
1736 snprintf(buf, sizeof(buf), "%s//", pmu->name);
1743 info.pmu_name = pmu->name;
1752 bool pmu__name_match(const struct perf_pmu *pmu, const char *pmu_name)
1754 return !strcmp(pmu->name, pmu_name) ||
1755 (pmu->is_uncore && pmu_uncore_alias_match(pmu_name, pmu->name)) ||
1760 (pmu->is_core && !strcmp(pmu_name, "default_core"));
1763 bool perf_pmu__is_software(const struct perf_pmu *pmu)
1771 if (pmu->is_core || pmu->is_uncore || pmu->auxtrace)
1773 switch (pmu->type) {
1783 if (!strcmp(pmu->name, known_sw_pmus[i]))
1789 FILE *perf_pmu__open_file(const struct perf_pmu *pmu, const char *name)
1793 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, name) ||
1800 FILE *perf_pmu__open_file_at(const struct perf_pmu *pmu, int dirfd, const char *name)
1804 fd = perf_pmu__pathname_fd(dirfd, pmu->name, name, O_RDONLY);
1811 int perf_pmu__scan_file(const struct perf_pmu *pmu, const char *name, const char *fmt,
1819 file = perf_pmu__open_file(pmu, name);
1828 int perf_pmu__scan_file_at(const struct perf_pmu *pmu, int dirfd, const char *name,
1836 file = perf_pmu__open_file_at(pmu, dirfd, name);
1845 bool perf_pmu__file_exists(const struct perf_pmu *pmu, const char *name)
1849 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, name))
1879 static void perf_pmu__del_caps(struct perf_pmu *pmu)
1883 list_for_each_entry_safe(caps, tmp, &pmu->caps, list) {
1892 * Reading/parsing the given pmu capabilities, which should be located at:
1896 int perf_pmu__caps_parse(struct perf_pmu *pmu)
1904 if (pmu->caps_initialized)
1905 return pmu->nr_caps;
1907 pmu->nr_caps = 0;
1909 if (!perf_pmu__pathname_scnprintf(caps_path, sizeof(caps_path), pmu->name, "caps"))
1913 pmu->caps_initialized = true;
1942 (perf_pmu__new_caps(&pmu->caps, name, value) < 0)) {
1947 pmu->nr_caps++;
1953 pmu->caps_initialized = true;
1954 return pmu->nr_caps;
1957 static void perf_pmu__compute_config_masks(struct perf_pmu *pmu)
1961 if (pmu->config_masks_computed)
1964 list_for_each_entry(format, &pmu->format, list) {
1971 pmu->config_masks_present = true;
1972 mask = &pmu->config_masks[format->value];
1977 pmu->config_masks_computed = true;
1980 void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
1987 perf_pmu__compute_config_masks(pmu);
1992 if (!pmu->config_masks_present)
1995 bits = config & ~pmu->config_masks[config_num];
2075 void perf_pmu__delete(struct perf_pmu *pmu)
2077 perf_pmu__del_formats(&pmu->format);
2078 perf_pmu__del_aliases(pmu);
2079 perf_pmu__del_caps(pmu);
2081 perf_cpu_map__put(pmu->cpus);
2083 zfree(&pmu->name);
2084 zfree(&pmu->alias_name);
2085 zfree(&pmu->id);
2086 free(pmu);