Lines Matching refs:pmu

20 #include "pmu.h"
22 #include <util/pmu-bison.h>
23 #include <util/pmu-flex.h>
40 * pmu-events.c, created by parsing the pmu-events json files.
115 static int pmu_aliases_parse(struct perf_pmu *pmu);
158 static void perf_pmu_format__load(struct perf_pmu *pmu, struct perf_pmu_format *format)
166 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, "format"))
184 int perf_pmu__format_parse(struct perf_pmu *pmu, int dirfd, bool eager_load)
201 format = perf_pmu__new_format(&pmu->format, name);
230 * Reading/parsing the default pmu format definition, which should be
234 static int pmu_format(struct perf_pmu *pmu, int dirfd, const char *name)
243 if (perf_pmu__format_parse(pmu, fd, /*eager_load=*/false))
286 static int perf_pmu__parse_scale(struct perf_pmu *pmu, struct perf_pmu_alias *alias)
298 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.scale", pmu->name, alias->name);
322 static int perf_pmu__parse_unit(struct perf_pmu *pmu, struct perf_pmu_alias *alias)
333 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.unit", pmu->name, alias->name);
358 perf_pmu__parse_per_pkg(struct perf_pmu *pmu, struct perf_pmu_alias *alias)
367 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.per-pkg", pmu->name, alias->name);
379 static int perf_pmu__parse_snapshot(struct perf_pmu *pmu, struct perf_pmu_alias *alias)
388 scnprintf(path + len, sizeof(path) - len, "%s/events/%s.snapshot", pmu->name, alias->name);
411 static void perf_pmu__del_aliases(struct perf_pmu *pmu)
415 list_for_each_entry_safe(alias, tmp, &pmu->aliases, list) {
421 static struct perf_pmu_alias *perf_pmu__find_alias(struct perf_pmu *pmu,
427 if (load && !pmu->sysfs_aliases_loaded)
428 pmu_aliases_parse(pmu);
430 list_for_each_entry(alias, &pmu->aliases, list) {
455 static void read_alias_info(struct perf_pmu *pmu, struct perf_pmu_alias *alias)
463 perf_pmu__parse_unit(pmu, alias);
464 perf_pmu__parse_scale(pmu, alias);
465 perf_pmu__parse_per_pkg(pmu, alias);
466 perf_pmu__parse_snapshot(pmu, alias);
470 struct perf_pmu *pmu;
481 read_alias_info(data->pmu, data->alias);
500 static int perf_pmu__new_alias(struct perf_pmu *pmu, const char *name,
509 if (perf_pmu__find_alias(pmu, name, /*load=*/ false)) {
520 pmu_name = pe->pmu;
557 .pmu = pmu,
562 if (pmu->events_table) {
563 if (pmu_events_table__find_event(pmu->events_table, pmu, name,
565 pmu->loaded_json_aliases++;
570 pmu->sysfs_aliases++;
572 pmu->loaded_json_aliases++;
573 list_add_tail(&alias->list, &pmu->aliases);
595 * Reading the pmu event aliases definition, which should be located at:
598 static int pmu_aliases_parse(struct perf_pmu *pmu)
609 scnprintf(path + len, sizeof(path) - len, "%s/events", pmu->name);
613 pmu->sysfs_aliases_loaded = true;
647 if (perf_pmu__new_alias(pmu, name, /*desc=*/ NULL,
655 pmu->sysfs_aliases_loaded = true;
697 struct perf_pmu pmu = {.name = pmu_name};
702 file = perf_pmu__open_file_at(&pmu, dirfd, *template);
758 char *perf_pmu__getcpuid(struct perf_pmu *pmu)
767 cpuid = get_cpuid_str(pmu);
881 struct perf_pmu *pmu = vdata;
883 perf_pmu__new_alias(pmu, pe->name, pe->desc, pe->event, /*val_fd=*/ NULL, pe);
891 void pmu_add_cpu_aliases_table(struct perf_pmu *pmu, const struct pmu_events_table *table)
893 pmu_events_table__for_each_event(table, pmu, pmu_add_cpu_aliases_map_callback, pmu);
896 static void pmu_add_cpu_aliases(struct perf_pmu *pmu)
898 if (!pmu->events_table)
901 if (pmu->cpu_aliases_added)
904 pmu_add_cpu_aliases_table(pmu, pmu->events_table);
905 pmu->cpu_aliases_added = true;
912 struct perf_pmu *pmu = vdata;
914 if (!pe->compat || !pe->pmu)
917 if (!strcmp(pmu->id, pe->compat) &&
918 pmu_uncore_alias_match(pe->pmu, pmu->name)) {
919 perf_pmu__new_alias(pmu,
930 void pmu_add_sys_aliases(struct perf_pmu *pmu)
932 if (!pmu->id)
935 pmu_for_each_sys_event(pmu_add_sys_aliases_iter_fn, pmu);
939 perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused)
956 static int pmu_max_precise(int dirfd, struct perf_pmu *pmu)
960 perf_pmu__scan_file_at(pmu, dirfd, "caps/max_precise", "%d", &max_precise);
966 struct perf_pmu *pmu;
971 pmu = zalloc(sizeof(*pmu));
972 if (!pmu)
975 pmu->name = strdup(name);
976 if (!pmu->name)
983 if (perf_pmu__scan_file_at(pmu, dirfd, "type", "%u", &type) != 1)
986 INIT_LIST_HEAD(&pmu->format);
987 INIT_LIST_HEAD(&pmu->aliases);
988 INIT_LIST_HEAD(&pmu->caps);
991 * The pmu data we store & need consists of the pmu
995 if (pmu_format(pmu, dirfd, name))
998 pmu->is_core = is_pmu_core(name);
999 pmu->cpus = pmu_cpumask(dirfd, name, pmu->is_core);
1003 pmu->alias_name = strdup(alias_name);
1004 if (!pmu->alias_name)
1008 pmu->type = type;
1009 pmu->is_uncore = pmu_is_uncore(dirfd, name);
1010 if (pmu->is_uncore)
1011 pmu->id = pmu_id(name);
1012 pmu->max_precise = pmu_max_precise(dirfd, pmu);
1013 pmu->events_table = perf_pmu__find_events_table(pmu);
1014 pmu_add_sys_aliases(pmu);
1015 list_add_tail(&pmu->list, pmus);
1017 pmu->default_config = perf_pmu__get_default_config(pmu);
1019 return pmu;
1021 zfree(&pmu->name);
1022 free(pmu);
1029 struct perf_pmu *pmu = zalloc(sizeof(*pmu));
1031 if (!pmu)
1034 pmu->name = strdup("cpu");
1035 if (!pmu->name) {
1036 free(pmu);
1040 pmu->is_core = true;
1041 pmu->type = PERF_TYPE_RAW;
1042 pmu->cpus = cpu_map__online();
1044 INIT_LIST_HEAD(&pmu->format);
1045 INIT_LIST_HEAD(&pmu->aliases);
1046 INIT_LIST_HEAD(&pmu->caps);
1047 list_add_tail(&pmu->list, core_pmus);
1048 return pmu;
1051 void perf_pmu__warn_invalid_formats(struct perf_pmu *pmu)
1055 if (pmu->formats_checked)
1058 pmu->formats_checked = true;
1060 /* fake pmu doesn't have format list */
1061 if (pmu == &perf_pmu__fake)
1064 list_for_each_entry(format, &pmu->format, list) {
1065 perf_pmu_format__load(pmu, format);
1069 pmu->name, format->name, format->value);
1077 struct perf_pmu *pmu = evsel__find_pmu(evsel);
1079 return pmu && pmu->auxtrace;
1091 void evsel__set_config_if_unset(struct perf_pmu *pmu, struct evsel *evsel,
1100 bits = perf_pmu__format_bits(pmu, config_name);
1123 __u64 perf_pmu__format_bits(struct perf_pmu *pmu, const char *name)
1125 struct perf_pmu_format *format = pmu_find_format(&pmu->format, name);
1138 int perf_pmu__format_type(struct perf_pmu *pmu, const char *name)
1140 struct perf_pmu_format *format = pmu_find_format(&pmu->format, name);
1145 perf_pmu_format__load(pmu, format);
1236 static int pmu_config_term(struct perf_pmu *pmu,
1260 format = pmu_find_format(&pmu->format, term->config);
1262 char *pmu_term = pmu_formats_string(&pmu->format);
1267 "unknown term '%s' for pmu '%s'",
1268 term->config, pmu->name) < 0)
1282 perf_pmu_format__load(pmu, format);
1359 int perf_pmu__config_terms(struct perf_pmu *pmu,
1367 if (pmu_config_term(pmu, attr, term, head_terms, zero, err))
1377 * 2) pmu format definitions - specified by pmu parameter
1379 int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr,
1383 bool zero = !!pmu->default_config;
1385 return perf_pmu__config_terms(pmu, attr, head_terms, zero, err);
1388 static struct perf_pmu_alias *pmu_find_alias(struct perf_pmu *pmu,
1400 if (pmu_find_format(&pmu->format, term->config))
1412 alias = perf_pmu__find_alias(pmu, name, /*load=*/ true);
1413 if (alias || pmu->cpu_aliases_added)
1417 if (pmu->events_table &&
1418 pmu_events_table__find_event(pmu->events_table, pmu, name,
1420 pmu) == 0) {
1421 alias = perf_pmu__find_alias(pmu, name, /*load=*/ false);
1427 static int check_info_data(struct perf_pmu *pmu,
1433 read_alias_info(pmu, alias);
1474 int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms,
1492 alias = pmu_find_alias(pmu, term);
1503 ret = check_info_data(pmu, alias, info, err, term->err_term);
1544 int perf_pmu__find_event(struct perf_pmu *pmu, const char *event, void *state, pmu_event_callback cb)
1553 return perf_pmu__for_each_event(pmu, /*skip_duplicate_pmus=*/ false,
1568 bool perf_pmu__has_format(const struct perf_pmu *pmu, const char *name)
1572 list_for_each_entry(format, &pmu->format, list) {
1584 bool perf_pmu__supports_legacy_cache(const struct perf_pmu *pmu)
1586 return pmu->is_core;
1589 bool perf_pmu__auto_merge_stats(const struct perf_pmu *pmu)
1591 return !pmu->is_core || perf_pmus__num_core_pmus() == 1;
1594 bool perf_pmu__have_event(struct perf_pmu *pmu, const char *name)
1596 if (perf_pmu__find_alias(pmu, name, /*load=*/ true) != NULL)
1598 if (pmu->cpu_aliases_added || !pmu->events_table)
1600 return pmu_events_table__find_event(pmu->events_table, pmu, name, NULL, NULL) == 0;
1603 size_t perf_pmu__num_events(struct perf_pmu *pmu)
1607 if (!pmu->sysfs_aliases_loaded)
1608 pmu_aliases_parse(pmu);
1610 nr = pmu->sysfs_aliases;
1612 if (pmu->cpu_aliases_added)
1613 nr += pmu->loaded_json_aliases;
1614 else if (pmu->events_table)
1615 nr += pmu_events_table__num_events(pmu->events_table, pmu) - pmu->loaded_json_aliases;
1617 return pmu->selectable ? nr + 1 : nr;
1627 static char *format_alias(char *buf, int len, const struct perf_pmu *pmu,
1632 ? pmu_name_len_no_suffix(pmu->name, /*num=*/NULL)
1633 : (int)strlen(pmu->name);
1634 int used = snprintf(buf, len, "%.*s/%s", pmu_name_len, pmu->name, alias->name);
1656 int perf_pmu__for_each_event(struct perf_pmu *pmu, bool skip_duplicate_pmus,
1662 .pmu = pmu,
1668 pmu_add_cpu_aliases(pmu);
1669 list_for_each_entry(event, &pmu->aliases, list) {
1672 info.pmu_name = event->pmu_name ?: pmu->name;
1678 info.name = format_alias(buf, sizeof(buf), pmu, event,
1680 if (pmu->is_core) {
1706 if (pmu->selectable) {
1708 snprintf(buf, sizeof(buf), "%s//", pmu->name);
1715 info.pmu_name = pmu->name;
1724 bool pmu__name_match(const struct perf_pmu *pmu, const char *pmu_name)
1726 return !strcmp(pmu->name, pmu_name) ||
1727 (pmu->is_uncore && pmu_uncore_alias_match(pmu_name, pmu->name)) ||
1732 (pmu->is_core && !strcmp(pmu_name, "default_core"));
1735 bool perf_pmu__is_software(const struct perf_pmu *pmu)
1743 if (pmu->is_core || pmu->is_uncore || pmu->auxtrace)
1745 switch (pmu->type) {
1755 if (!strcmp(pmu->name, known_sw_pmus[i]))
1761 FILE *perf_pmu__open_file(struct perf_pmu *pmu, const char *name)
1765 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, name) ||
1772 FILE *perf_pmu__open_file_at(struct perf_pmu *pmu, int dirfd, const char *name)
1776 fd = perf_pmu__pathname_fd(dirfd, pmu->name, name, O_RDONLY);
1783 int perf_pmu__scan_file(struct perf_pmu *pmu, const char *name, const char *fmt,
1791 file = perf_pmu__open_file(pmu, name);
1800 int perf_pmu__scan_file_at(struct perf_pmu *pmu, int dirfd, const char *name,
1808 file = perf_pmu__open_file_at(pmu, dirfd, name);
1817 bool perf_pmu__file_exists(struct perf_pmu *pmu, const char *name)
1821 if (!perf_pmu__pathname_scnprintf(path, sizeof(path), pmu->name, name))
1851 static void perf_pmu__del_caps(struct perf_pmu *pmu)
1855 list_for_each_entry_safe(caps, tmp, &pmu->caps, list) {
1864 * Reading/parsing the given pmu capabilities, which should be located at:
1868 int perf_pmu__caps_parse(struct perf_pmu *pmu)
1876 if (pmu->caps_initialized)
1877 return pmu->nr_caps;
1879 pmu->nr_caps = 0;
1881 if (!perf_pmu__pathname_scnprintf(caps_path, sizeof(caps_path), pmu->name, "caps"))
1885 pmu->caps_initialized = true;
1914 (perf_pmu__new_caps(&pmu->caps, name, value) < 0)) {
1919 pmu->nr_caps++;
1925 pmu->caps_initialized = true;
1926 return pmu->nr_caps;
1929 static void perf_pmu__compute_config_masks(struct perf_pmu *pmu)
1933 if (pmu->config_masks_computed)
1936 list_for_each_entry(format, &pmu->format, list) {
1943 pmu->config_masks_present = true;
1944 mask = &pmu->config_masks[format->value];
1949 pmu->config_masks_computed = true;
1952 void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
1959 perf_pmu__compute_config_masks(pmu);
1964 if (!pmu->config_masks_present)
1967 bits = config & ~pmu->config_masks[config_num];
2047 void perf_pmu__delete(struct perf_pmu *pmu)
2049 perf_pmu__del_formats(&pmu->format);
2050 perf_pmu__del_aliases(pmu);
2051 perf_pmu__del_caps(pmu);
2053 perf_cpu_map__put(pmu->cpus);
2055 zfree(&pmu->default_config);
2056 zfree(&pmu->name);
2057 zfree(&pmu->alias_name);
2058 zfree(&pmu->id);
2059 free(pmu);
2064 struct perf_pmu *pmu = NULL;
2066 while ((pmu = perf_pmus__scan_core(pmu))) {
2071 if (RC_CHK_ACCESS(pmu->cpus)->nr != cpu__max_cpu().cpu)
2074 return pmu;