Lines Matching full:pmu

24 #include "pmu.h"
30 #include "pmu-hybrid.h"
86 * Reading/parsing the default pmu format definition, which should be
337 pmu_name = (char *)pe->pmu; in __perf_pmu__new_alias()
360 * event=0x0091 (read from files ../<PMU>/events/<FILE> in __perf_pmu__new_alias()
493 * Reading the pmu event aliases definition, which should be located at:
541 * Reading/parsing the default pmu type value, which should be
572 /* Add all pmus in sysfs to pmu list: */
675 * PMU CORE devices have different name other than cpu in sysfs on some
693 char *perf_pmu__getcpuid(struct perf_pmu *pmu) in perf_pmu__getcpuid() argument
702 cpuid = get_cpuid_str(pmu); in perf_pmu__getcpuid()
757 * uncore alias may be from different PMU with common prefix in pmu_uncore_alias_match()
767 * list of tokens, orderly contained in the matching PMU name. in pmu_uncore_alias_match()
769 * Example: For alias "socket,pmuname" and PMU "socketX_pmunameY", we in pmu_uncore_alias_match()
798 struct perf_pmu *pmu; member
806 const char *pname = pe->pmu ? pe->pmu : data->cpu_name; in pmu_add_cpu_aliases_map_callback()
811 if (data->pmu->is_uncore && pmu_uncore_alias_match(pname, data->name)) in pmu_add_cpu_aliases_map_callback()
825 * From the pmu_events_map, find the table of PMU events that corresponds
826 * to the current running CPU. Then, add all PMU events from that table
829 void pmu_add_cpu_aliases_table(struct list_head *head, struct perf_pmu *pmu, in pmu_add_cpu_aliases_table() argument
834 .name = pmu->name, in pmu_add_cpu_aliases_table()
835 .cpu_name = is_arm_pmu_core(pmu->name) ? pmu->name : "cpu", in pmu_add_cpu_aliases_table()
836 .pmu = pmu, in pmu_add_cpu_aliases_table()
842 static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu) in pmu_add_cpu_aliases() argument
846 table = perf_pmu__find_table(pmu); in pmu_add_cpu_aliases()
850 pmu_add_cpu_aliases_table(head, pmu, table); in pmu_add_cpu_aliases()
855 struct perf_pmu *pmu; member
863 struct perf_pmu *pmu = idata->pmu; in pmu_add_sys_aliases_iter_fn() local
871 if (!pe->compat || !pe->pmu) in pmu_add_sys_aliases_iter_fn()
874 if (!strcmp(pmu->id, pe->compat) && in pmu_add_sys_aliases_iter_fn()
875 pmu_uncore_alias_match(pe->pmu, pmu->name)) { in pmu_add_sys_aliases_iter_fn()
886 void pmu_add_sys_aliases(struct list_head *head, struct perf_pmu *pmu) in pmu_add_sys_aliases() argument
890 .pmu = pmu, in pmu_add_sys_aliases()
893 if (!pmu->id) in pmu_add_sys_aliases()
900 perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused) in perf_pmu__get_default_config()
932 struct perf_pmu *pmu; in pmu_lookup() local
941 * Check pmu name for hybrid and the pmu may be invalid in sysfs in pmu_lookup()
947 * The pmu data we store & need consists of the pmu in pmu_lookup()
963 pmu = zalloc(sizeof(*pmu)); in pmu_lookup()
964 if (!pmu) in pmu_lookup()
967 pmu->cpus = pmu_cpumask(name); in pmu_lookup()
968 pmu->name = strdup(name); in pmu_lookup()
969 if (!pmu->name) in pmu_lookup()
974 pmu->alias_name = strdup(alias_name); in pmu_lookup()
975 if (!pmu->alias_name) in pmu_lookup()
979 pmu->type = type; in pmu_lookup()
980 pmu->is_uncore = pmu_is_uncore(name); in pmu_lookup()
981 if (pmu->is_uncore) in pmu_lookup()
982 pmu->id = pmu_id(name); in pmu_lookup()
983 pmu->is_hybrid = is_hybrid; in pmu_lookup()
984 pmu->max_precise = pmu_max_precise(name); in pmu_lookup()
985 pmu_add_cpu_aliases(&aliases, pmu); in pmu_lookup()
986 pmu_add_sys_aliases(&aliases, pmu); in pmu_lookup()
988 INIT_LIST_HEAD(&pmu->format); in pmu_lookup()
989 INIT_LIST_HEAD(&pmu->aliases); in pmu_lookup()
990 INIT_LIST_HEAD(&pmu->caps); in pmu_lookup()
991 list_splice(&format, &pmu->format); in pmu_lookup()
992 list_splice(&aliases, &pmu->aliases); in pmu_lookup()
993 list_add_tail(&pmu->list, &pmus); in pmu_lookup()
995 if (pmu->is_hybrid) in pmu_lookup()
996 list_add_tail(&pmu->hybrid_list, &perf_pmu__hybrid_pmus); in pmu_lookup()
998 pmu->default_config = perf_pmu__get_default_config(pmu); in pmu_lookup()
1000 return pmu; in pmu_lookup()
1002 if (pmu->name) in pmu_lookup()
1003 free(pmu->name); in pmu_lookup()
1004 free(pmu); in pmu_lookup()
1008 void perf_pmu__warn_invalid_formats(struct perf_pmu *pmu) in perf_pmu__warn_invalid_formats() argument
1012 /* fake pmu doesn't have format list */ in perf_pmu__warn_invalid_formats()
1013 if (pmu == &perf_pmu__fake) in perf_pmu__warn_invalid_formats()
1016 list_for_each_entry(format, &pmu->format, list) in perf_pmu__warn_invalid_formats()
1020 pmu->name, format->name, format->value); in perf_pmu__warn_invalid_formats()
1027 struct perf_pmu *pmu; in pmu_find() local
1029 list_for_each_entry(pmu, &pmus, list) { in pmu_find()
1030 if (!strcmp(pmu->name, name) || in pmu_find()
1031 (pmu->alias_name && !strcmp(pmu->alias_name, name))) in pmu_find()
1032 return pmu; in pmu_find()
1040 struct perf_pmu *pmu; in perf_pmu__find_by_type() local
1042 list_for_each_entry(pmu, &pmus, list) in perf_pmu__find_by_type()
1043 if (pmu->type == type) in perf_pmu__find_by_type()
1044 return pmu; in perf_pmu__find_by_type()
1049 struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu) in perf_pmu__scan() argument
1052 * pmu iterator: If pmu is NULL, we start at the begin, in perf_pmu__scan()
1053 * otherwise return the next pmu. Returns NULL on end. in perf_pmu__scan()
1055 if (!pmu) { in perf_pmu__scan()
1057 pmu = list_prepare_entry(pmu, &pmus, list); in perf_pmu__scan()
1059 list_for_each_entry_continue(pmu, &pmus, list) in perf_pmu__scan()
1060 return pmu; in perf_pmu__scan()
1066 struct perf_pmu *pmu = NULL; in evsel__find_pmu() local
1068 while ((pmu = perf_pmu__scan(pmu)) != NULL) { in evsel__find_pmu()
1069 if (pmu->type == evsel->core.attr.type) in evsel__find_pmu()
1073 return pmu; in evsel__find_pmu()
1078 struct perf_pmu *pmu = evsel__find_pmu(evsel); in evsel__is_aux_event() local
1080 return pmu && pmu->auxtrace; in evsel__is_aux_event()
1085 struct perf_pmu *pmu; in perf_pmu__find() local
1088 * Once PMU is loaded it stays in the list, in perf_pmu__find()
1090 * the pmu format definitions. in perf_pmu__find()
1092 pmu = pmu_find(name); in perf_pmu__find()
1093 if (pmu) in perf_pmu__find()
1094 return pmu; in perf_pmu__find()
1255 "unknown term '%s' for pmu '%s'", in pmu_config_term()
1363 * 2) pmu format definitions - specified by pmu parameter
1365 int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr, in perf_pmu__config() argument
1369 bool zero = !!pmu->default_config; in perf_pmu__config()
1371 attr->type = pmu->type; in perf_pmu__config()
1372 return perf_pmu__config_terms(pmu->name, &pmu->format, attr, in perf_pmu__config()
1376 static struct perf_pmu_alias *pmu_find_alias(struct perf_pmu *pmu, in pmu_find_alias() argument
1388 if (pmu_find_format(&pmu->format, term->config)) in pmu_find_alias()
1399 list_for_each_entry(alias, &pmu->aliases, list) { in pmu_find_alias()
1436 int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms, in perf_pmu__check_alias() argument
1456 alias = pmu_find_alias(pmu, term); in perf_pmu__check_alias()
1537 static char *format_alias(char *buf, int len, struct perf_pmu *pmu, in format_alias() argument
1541 int used = snprintf(buf, len, "%s/%s", pmu->name, alias->name); in format_alias()
1563 static char *format_alias_or(char *buf, int len, struct perf_pmu *pmu, in format_alias_or() argument
1566 snprintf(buf, len, "%s OR %s/%s/", alias->name, pmu->name, alias->name); in format_alias_or()
1575 char *pmu; member
1603 if (as->pmu && bs->pmu) in cmp_sevent()
1604 return strcmp(as->pmu, bs->pmu); in cmp_sevent()
1644 if (perf_pmu__is_hybrid(alias_a->pmu) && in pmu_alias_is_duplicate()
1645 perf_pmu__is_hybrid(alias_b->pmu)) in pmu_alias_is_duplicate()
1655 struct perf_pmu *pmu; in print_pmu_events() local
1665 pmu = NULL; in print_pmu_events()
1667 while ((pmu = perf_pmu__scan(pmu)) != NULL) { in print_pmu_events()
1668 list_for_each_entry(alias, &pmu->aliases, list) in print_pmu_events()
1670 if (pmu->selectable) in print_pmu_events()
1676 pmu = NULL; in print_pmu_events()
1678 while ((pmu = perf_pmu__scan(pmu)) != NULL) { in print_pmu_events()
1679 if (pmu_name && perf_pmu__is_hybrid(pmu->name) && in print_pmu_events()
1680 strcmp(pmu_name, pmu->name)) { in print_pmu_events()
1684 list_for_each_entry(alias, &pmu->aliases, list) { in print_pmu_events()
1686 format_alias(buf, sizeof(buf), pmu, alias); in print_pmu_events()
1687 bool is_cpu = is_pmu_core(pmu->name) || in print_pmu_events()
1688 perf_pmu__is_hybrid(pmu->name); in print_pmu_events()
1702 name = format_alias_or(buf, sizeof(buf), pmu, alias); in print_pmu_events()
1708 pmu, alias); in print_pmu_events()
1717 aliases[j].pmu = pmu->name; in print_pmu_events()
1723 if (pmu->selectable && in print_pmu_events()
1724 (event_glob == NULL || strglobmatch(pmu->name, event_glob))) { in print_pmu_events()
1726 if (asprintf(&s, "%s//", pmu->name) < 0) in print_pmu_events()
1757 printf("%*s%s/%s/ ", 8, "", aliases[j].pmu, aliases[j].str); in print_pmu_events()
1765 printf(" %-50s [Kernel PMU event]\n", aliases[j].name); in print_pmu_events()
1777 printf("FATAL: not enough memory to print PMU events\n"); in print_pmu_events()
1784 struct perf_pmu *pmu; in pmu_have_event() local
1787 pmu = NULL; in pmu_have_event()
1788 while ((pmu = perf_pmu__scan(pmu)) != NULL) { in pmu_have_event()
1789 if (strcmp(pname, pmu->name)) in pmu_have_event()
1791 list_for_each_entry(alias, &pmu->aliases, list) in pmu_have_event()
1798 static FILE *perf_pmu__open_file(struct perf_pmu *pmu, const char *name) in perf_pmu__open_file() argument
1808 "%s" EVENT_SOURCE_DEVICE_PATH "%s/%s", sysfs, pmu->name, name); in perf_pmu__open_file()
1814 int perf_pmu__scan_file(struct perf_pmu *pmu, const char *name, const char *fmt, in perf_pmu__scan_file() argument
1822 file = perf_pmu__open_file(pmu, name); in perf_pmu__scan_file()
1856 * Reading/parsing the given pmu capabilities, which should be located at:
1860 int perf_pmu__caps_parse(struct perf_pmu *pmu) in perf_pmu__caps_parse() argument
1868 if (pmu->caps_initialized) in perf_pmu__caps_parse()
1869 return pmu->nr_caps; in perf_pmu__caps_parse()
1871 pmu->nr_caps = 0; in perf_pmu__caps_parse()
1877 "%s" EVENT_SOURCE_DEVICE_PATH "%s/caps", sysfs, pmu->name); in perf_pmu__caps_parse()
1880 pmu->caps_initialized = true; in perf_pmu__caps_parse()
1904 (perf_pmu__new_caps(&pmu->caps, name, value) < 0)) { in perf_pmu__caps_parse()
1909 pmu->nr_caps++; in perf_pmu__caps_parse()
1915 pmu->caps_initialized = true; in perf_pmu__caps_parse()
1916 return pmu->nr_caps; in perf_pmu__caps_parse()
1919 void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config, in perf_pmu__warn_invalid_config() argument
1927 list_for_each_entry(format, &pmu->format, list) { in perf_pmu__warn_invalid_config()
1976 int perf_pmu__cpus_match(struct perf_pmu *pmu, struct perf_cpu_map *cpus, in perf_pmu__cpus_match() argument
1980 struct perf_cpu_map *pmu_cpus = pmu->cpus; in perf_pmu__cpus_match()