Lines Matching full:pmu
18 #include "pmu.h"
26 * core_pmus: A PMU belongs to core_pmus if it's name is "cpu" or it's sysfs
28 * must have pmu->is_core=1. If there are more than one PMU in
31 * homogeneous PMU, and thus they are treated as homogeneous
34 * matter whether PMU is present per SMT-thread or outside of the
38 * must have pmu->is_core=0 but pmu->is_uncore could be 0 or 1.
83 * that S390's cpum_cf PMU doesn't match. in pmu_name_len_no_suffix()
113 struct perf_pmu *pmu, *tmp; in perf_pmus__destroy() local
115 list_for_each_entry_safe(pmu, tmp, &core_pmus, list) { in perf_pmus__destroy()
116 list_del(&pmu->list); in perf_pmus__destroy()
118 perf_pmu__delete(pmu); in perf_pmus__destroy()
120 list_for_each_entry_safe(pmu, tmp, &other_pmus, list) { in perf_pmus__destroy()
121 list_del(&pmu->list); in perf_pmus__destroy()
123 perf_pmu__delete(pmu); in perf_pmus__destroy()
130 struct perf_pmu *pmu; in pmu_find() local
132 list_for_each_entry(pmu, &core_pmus, list) { in pmu_find()
133 if (!strcmp(pmu->name, name) || in pmu_find()
134 (pmu->alias_name && !strcmp(pmu->alias_name, name))) in pmu_find()
135 return pmu; in pmu_find()
137 list_for_each_entry(pmu, &other_pmus, list) { in pmu_find()
138 if (!strcmp(pmu->name, name) || in pmu_find()
139 (pmu->alias_name && !strcmp(pmu->alias_name, name))) in pmu_find()
140 return pmu; in pmu_find()
148 struct perf_pmu *pmu; in perf_pmus__find() local
154 * Once PMU is loaded it stays in the list, in perf_pmus__find()
156 * the pmu format definitions. in perf_pmus__find()
158 pmu = pmu_find(name); in perf_pmus__find()
159 if (pmu) in perf_pmus__find()
160 return pmu; in perf_pmus__find()
170 pmu = perf_pmu__lookup(core_pmu ? &core_pmus : &other_pmus, dirfd, name, in perf_pmus__find()
174 if (pmu) in perf_pmus__find()
175 return pmu; in perf_pmus__find()
177 /* Looking up an individual perf event PMU failed, check if a tool PMU should be read. */ in perf_pmus__find()
187 pmu = pmu_find(name); in perf_pmus__find()
188 if (pmu) in perf_pmus__find()
189 return pmu; in perf_pmus__find()
191 /* Read all necessary PMUs from sysfs and see if the PMU is found. */ in perf_pmus__find()
201 struct perf_pmu *pmu; in perf_pmu__find2() local
205 * Once PMU is loaded it stays in the list, in perf_pmu__find2()
207 * the pmu format definitions. in perf_pmu__find2()
209 pmu = pmu_find(name); in perf_pmu__find2()
210 if (pmu) in perf_pmu__find2()
211 return pmu; in perf_pmu__find2()
233 /* Add all pmus in sysfs to pmu list: */
239 /* All requested PMU types have been read. */ in pmu_read_sysfs()
293 struct perf_pmu *pmu; in __perf_pmus__find_by_type() local
295 list_for_each_entry(pmu, &core_pmus, list) { in __perf_pmus__find_by_type()
296 if (pmu->type == type) in __perf_pmus__find_by_type()
297 return pmu; in __perf_pmus__find_by_type()
300 list_for_each_entry(pmu, &other_pmus, list) { in __perf_pmus__find_by_type()
301 if (pmu->type == type) in __perf_pmus__find_by_type()
302 return pmu; in __perf_pmus__find_by_type()
310 struct perf_pmu *pmu = __perf_pmus__find_by_type(type); in perf_pmus__find_by_type() local
312 if (pmu || (read_pmu_types == PERF_TOOL_PMU_TYPE_ALL_MASK)) in perf_pmus__find_by_type()
313 return pmu; in perf_pmus__find_by_type()
326 pmu = __perf_pmus__find_by_type(type); in perf_pmus__find_by_type()
327 return pmu; in perf_pmus__find_by_type()
331 * pmu iterator: If pmu is NULL, we start at the begin, otherwise return the
332 * next pmu. Returns NULL on end.
334 struct perf_pmu *perf_pmus__scan(struct perf_pmu *pmu) in perf_pmus__scan() argument
336 bool use_core_pmus = !pmu || pmu->is_core; in perf_pmus__scan()
338 if (!pmu) { in perf_pmus__scan()
340 pmu = list_prepare_entry(pmu, &core_pmus, list); in perf_pmus__scan()
343 list_for_each_entry_continue(pmu, &core_pmus, list) in perf_pmus__scan()
344 return pmu; in perf_pmus__scan()
346 pmu = NULL; in perf_pmus__scan()
347 pmu = list_prepare_entry(pmu, &other_pmus, list); in perf_pmus__scan()
349 list_for_each_entry_continue(pmu, &other_pmus, list) in perf_pmus__scan()
350 return pmu; in perf_pmus__scan()
354 struct perf_pmu *perf_pmus__scan_core(struct perf_pmu *pmu) in perf_pmus__scan_core() argument
356 if (!pmu) { in perf_pmus__scan_core()
358 return list_first_entry_or_null(&core_pmus, typeof(*pmu), list); in perf_pmus__scan_core()
360 list_for_each_entry_continue(pmu, &core_pmus, list) in perf_pmus__scan_core()
361 return pmu; in perf_pmus__scan_core()
366 struct perf_pmu *perf_pmus__scan_for_event(struct perf_pmu *pmu, const char *event) in perf_pmus__scan_for_event() argument
368 bool use_core_pmus = !pmu || pmu->is_core; in perf_pmus__scan_for_event()
370 if (!pmu) { in perf_pmus__scan_for_event()
375 * Core PMUs, other sysfs PMUs and tool PMU can take all event in perf_pmus__scan_for_event()
391 pmu = list_prepare_entry(pmu, &core_pmus, list); in perf_pmus__scan_for_event()
394 list_for_each_entry_continue(pmu, &core_pmus, list) in perf_pmus__scan_for_event()
395 return pmu; in perf_pmus__scan_for_event()
397 pmu = NULL; in perf_pmus__scan_for_event()
398 pmu = list_prepare_entry(pmu, &other_pmus, list); in perf_pmus__scan_for_event()
400 list_for_each_entry_continue(pmu, &other_pmus, list) in perf_pmus__scan_for_event()
401 return pmu; in perf_pmus__scan_for_event()
405 struct perf_pmu *perf_pmus__scan_matching_wildcard(struct perf_pmu *pmu, const char *wildcard) in perf_pmus__scan_matching_wildcard() argument
407 bool use_core_pmus = !pmu || pmu->is_core; in perf_pmus__scan_matching_wildcard()
409 if (!pmu) { in perf_pmus__scan_matching_wildcard()
411 * Core PMUs, other sysfs PMUs and tool PMU can have any name or in perf_pmus__scan_matching_wildcard()
423 * such events unless the PMU could match. in perf_pmus__scan_matching_wildcard()
435 pmu = list_prepare_entry(pmu, &core_pmus, list); in perf_pmus__scan_matching_wildcard()
438 list_for_each_entry_continue(pmu, &core_pmus, list) { in perf_pmus__scan_matching_wildcard()
439 if (perf_pmu__wildcard_match(pmu, wildcard)) in perf_pmus__scan_matching_wildcard()
440 return pmu; in perf_pmus__scan_matching_wildcard()
442 pmu = NULL; in perf_pmus__scan_matching_wildcard()
443 pmu = list_prepare_entry(pmu, &other_pmus, list); in perf_pmus__scan_matching_wildcard()
445 list_for_each_entry_continue(pmu, &other_pmus, list) { in perf_pmus__scan_matching_wildcard()
446 if (perf_pmu__wildcard_match(pmu, wildcard)) in perf_pmus__scan_matching_wildcard()
447 return pmu; in perf_pmus__scan_matching_wildcard()
452 static struct perf_pmu *perf_pmus__scan_skip_duplicates(struct perf_pmu *pmu) in perf_pmus__scan_skip_duplicates() argument
454 bool use_core_pmus = !pmu || pmu->is_core; in perf_pmus__scan_skip_duplicates()
456 const char *last_pmu_name = (pmu && pmu->name) ? pmu->name : ""; in perf_pmus__scan_skip_duplicates()
458 if (!pmu) { in perf_pmus__scan_skip_duplicates()
460 pmu = list_prepare_entry(pmu, &core_pmus, list); in perf_pmus__scan_skip_duplicates()
462 last_pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: ""); in perf_pmus__scan_skip_duplicates()
465 list_for_each_entry_continue(pmu, &core_pmus, list) { in perf_pmus__scan_skip_duplicates()
466 int pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: ""); in perf_pmus__scan_skip_duplicates()
469 !strncmp(last_pmu_name, pmu->name ?: "", pmu_name_len)) in perf_pmus__scan_skip_duplicates()
472 return pmu; in perf_pmus__scan_skip_duplicates()
474 pmu = NULL; in perf_pmus__scan_skip_duplicates()
475 pmu = list_prepare_entry(pmu, &other_pmus, list); in perf_pmus__scan_skip_duplicates()
477 list_for_each_entry_continue(pmu, &other_pmus, list) { in perf_pmus__scan_skip_duplicates()
478 int pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: ""); in perf_pmus__scan_skip_duplicates()
481 !strncmp(last_pmu_name, pmu->name ?: "", pmu_name_len)) in perf_pmus__scan_skip_duplicates()
484 return pmu; in perf_pmus__scan_skip_duplicates()
491 struct perf_pmu *pmu = NULL; in perf_pmus__pmu_for_pmu_filter() local
493 while ((pmu = perf_pmus__scan(pmu)) != NULL) { in perf_pmus__pmu_for_pmu_filter()
494 if (!strcmp(pmu->name, str)) in perf_pmus__pmu_for_pmu_filter()
495 return pmu; in perf_pmus__pmu_for_pmu_filter()
497 if (!strncmp(pmu->name, "uncore_", 7)) { in perf_pmus__pmu_for_pmu_filter()
498 if (!strcmp(pmu->name + 7, str)) in perf_pmus__pmu_for_pmu_filter()
499 return pmu; in perf_pmus__pmu_for_pmu_filter()
502 if (!strncmp(pmu->name, "cpu_", 4)) { in perf_pmus__pmu_for_pmu_filter()
503 if (!strcmp(pmu->name + 4, str)) in perf_pmus__pmu_for_pmu_filter()
504 return pmu; in perf_pmus__pmu_for_pmu_filter()
512 /** PMU for event. */
513 const struct perf_pmu *pmu; member
543 a_iscpu = as->pmu ? as->pmu->is_core : true; in cmp_sevent()
544 b_iscpu = bs->pmu ? bs->pmu->is_core : true; in cmp_sevent()
548 /* Order by PMU name. */ in cmp_sevent()
549 if (as->pmu != bs->pmu) { in cmp_sevent()
582 pr_err("Unexpected event %s/%s/\n", info->pmu->name, info->name); in perf_pmus__print_pmu_events__callback()
585 assert(info->pmu != NULL || info->name != NULL); in perf_pmus__print_pmu_events__callback()
587 s->pmu = info->pmu; in perf_pmus__print_pmu_events__callback()
606 struct perf_pmu *pmu; in perf_pmus__print_pmu_events() local
619 pmu = NULL; in perf_pmus__print_pmu_events()
621 while ((pmu = scan_fn(pmu)) != NULL) in perf_pmus__print_pmu_events()
622 len += perf_pmu__num_events(pmu); in perf_pmus__print_pmu_events()
626 pr_err("FATAL: not enough memory to print PMU events\n"); in perf_pmus__print_pmu_events()
629 pmu = NULL; in perf_pmus__print_pmu_events()
635 while ((pmu = scan_fn(pmu)) != NULL) { in perf_pmus__print_pmu_events()
636 perf_pmu__for_each_event(pmu, skip_duplicate_pmus, &state, in perf_pmus__print_pmu_events()
648 aliases[j].pmu->type, in perf_pmus__print_pmu_events()
721 struct perf_pmu *pmu = NULL; in perf_pmus__print_raw_pmu_events() local
728 while ((pmu = scan_fn(pmu)) != NULL) { in perf_pmus__print_raw_pmu_events()
734 int len = pmu_name_len_no_suffix(pmu->name); in perf_pmus__print_raw_pmu_events()
737 if (!pmu->is_core) in perf_pmus__print_raw_pmu_events()
740 strbuf_addf(&format_args.short_string, "%.*s/", len, pmu->name); in perf_pmus__print_raw_pmu_events()
741 strbuf_addf(&format_args.long_string, "%.*s/", len, pmu->name); in perf_pmus__print_raw_pmu_events()
742 perf_pmu__for_each_format(pmu, &format_args, build_format_string); in perf_pmus__print_raw_pmu_events()
753 pmu->type, in perf_pmus__print_raw_pmu_events()
770 struct perf_pmu *pmu = perf_pmus__find(pname); in perf_pmus__have_event() local
772 return pmu && perf_pmu__have_event(pmu, name); in perf_pmus__have_event()
780 struct perf_pmu *pmu = NULL; in perf_pmus__num_core_pmus() local
782 while ((pmu = perf_pmus__scan_core(pmu)) != NULL) in perf_pmus__num_core_pmus()
790 struct perf_pmu *pmu = NULL; in __perf_pmus__supports_extended_type() local
795 while ((pmu = perf_pmus__scan_core(pmu)) != NULL) { in __perf_pmus__supports_extended_type()
796 …if (!is_event_supported(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES | ((__u64)pmu->type << PERF_P… in __perf_pmus__supports_extended_type()
821 struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type); in perf_pmus__find_by_attr() local
825 if (!pmu && legacy_core_type && perf_pmus__supports_extended_type()) { in perf_pmus__find_by_attr()
828 pmu = perf_pmus__find_by_type(type); in perf_pmus__find_by_attr()
830 if (!pmu && (legacy_core_type || type == PERF_TYPE_RAW)) { in perf_pmus__find_by_attr()
833 * assume the PMU is the first core PMU. in perf_pmus__find_by_attr()
835 * On architectures like ARM there is no sysfs PMU with type in perf_pmus__find_by_attr()
837 * by the first core PMU. in perf_pmus__find_by_attr()
839 pmu = perf_pmus__find_core_pmu(); in perf_pmus__find_by_attr()
841 return pmu; in perf_pmus__find_by_attr()
846 struct perf_pmu *pmu = evsel->pmu; in evsel__find_pmu() local
848 if (pmu) in evsel__find_pmu()
849 return pmu; in evsel__find_pmu()
851 pmu = perf_pmus__find_by_attr(&evsel->core.attr); in evsel__find_pmu()
852 ((struct evsel *)evsel)->pmu = pmu; in evsel__find_pmu()
853 return pmu; in evsel__find_pmu()
864 * Some PMU functions read from the sysfs mount point, so care is in perf_pmus__add_test_pmu()