Lines Matching full:pmu
17 #include "pmu.h"
24 * core_pmus: A PMU belongs to core_pmus if it's name is "cpu" or it's sysfs
26 * must have pmu->is_core=1. If there are more than one PMU in
29 * homogeneous PMU, and thus they are treated as homogeneous
32 * matter whether PMU is present per SMT-thread or outside of the
36 * must have pmu->is_core=0 but pmu->is_uncore could be 0 or 1.
78 * that S390's cpum_cf PMU doesn't match. in pmu_name_len_no_suffix()
108 struct perf_pmu *pmu, *tmp; in perf_pmus__destroy() local
110 list_for_each_entry_safe(pmu, tmp, &core_pmus, list) { in perf_pmus__destroy()
111 list_del(&pmu->list); in perf_pmus__destroy()
113 perf_pmu__delete(pmu); in perf_pmus__destroy()
115 list_for_each_entry_safe(pmu, tmp, &other_pmus, list) { in perf_pmus__destroy()
116 list_del(&pmu->list); in perf_pmus__destroy()
118 perf_pmu__delete(pmu); in perf_pmus__destroy()
125 struct perf_pmu *pmu; in pmu_find() local
127 list_for_each_entry(pmu, &core_pmus, list) { in pmu_find()
128 if (!strcmp(pmu->name, name) || in pmu_find()
129 (pmu->alias_name && !strcmp(pmu->alias_name, name))) in pmu_find()
130 return pmu; in pmu_find()
132 list_for_each_entry(pmu, &other_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()
143 struct perf_pmu *pmu; in perf_pmus__find() local
149 * Once PMU is loaded it stays in the list, in perf_pmus__find()
151 * the pmu format definitions. in perf_pmus__find()
153 pmu = pmu_find(name); in perf_pmus__find()
154 if (pmu) in perf_pmus__find()
155 return pmu; in perf_pmus__find()
165 pmu = perf_pmu__lookup(core_pmu ? &core_pmus : &other_pmus, dirfd, name, in perf_pmus__find()
169 if (pmu) in perf_pmus__find()
170 return pmu; in perf_pmus__find()
172 /* Looking up an individual perf event PMU failed, check if a tool PMU should be read. */ in perf_pmus__find()
180 pmu = pmu_find(name); in perf_pmus__find()
181 if (pmu) in perf_pmus__find()
182 return pmu; in perf_pmus__find()
184 /* Read all necessary PMUs from sysfs and see if the PMU is found. */ in perf_pmus__find()
194 struct perf_pmu *pmu; in perf_pmu__find2() local
198 * Once PMU is loaded it stays in the list, in perf_pmu__find2()
200 * the pmu format definitions. in perf_pmu__find2()
202 pmu = pmu_find(name); in perf_pmu__find2()
203 if (pmu) in perf_pmu__find2()
204 return pmu; in perf_pmu__find2()
226 /* Add all pmus in sysfs to pmu list: */
232 /* All requested PMU types have been read. */ in pmu_read_sysfs()
282 struct perf_pmu *pmu; in __perf_pmus__find_by_type() local
284 list_for_each_entry(pmu, &core_pmus, list) { in __perf_pmus__find_by_type()
285 if (pmu->type == type) in __perf_pmus__find_by_type()
286 return pmu; in __perf_pmus__find_by_type()
289 list_for_each_entry(pmu, &other_pmus, list) { in __perf_pmus__find_by_type()
290 if (pmu->type == type) in __perf_pmus__find_by_type()
291 return pmu; in __perf_pmus__find_by_type()
299 struct perf_pmu *pmu = __perf_pmus__find_by_type(type); in perf_pmus__find_by_type() local
301 if (pmu || (read_pmu_types == PERF_TOOL_PMU_TYPE_ALL_MASK)) in perf_pmus__find_by_type()
302 return pmu; in perf_pmus__find_by_type()
313 pmu = __perf_pmus__find_by_type(type); in perf_pmus__find_by_type()
314 return pmu; in perf_pmus__find_by_type()
318 * pmu iterator: If pmu is NULL, we start at the begin, otherwise return the
319 * next pmu. Returns NULL on end.
321 struct perf_pmu *perf_pmus__scan(struct perf_pmu *pmu) in perf_pmus__scan() argument
323 bool use_core_pmus = !pmu || pmu->is_core; in perf_pmus__scan()
325 if (!pmu) { in perf_pmus__scan()
327 pmu = list_prepare_entry(pmu, &core_pmus, list); in perf_pmus__scan()
330 list_for_each_entry_continue(pmu, &core_pmus, list) in perf_pmus__scan()
331 return pmu; in perf_pmus__scan()
333 pmu = NULL; in perf_pmus__scan()
334 pmu = list_prepare_entry(pmu, &other_pmus, list); in perf_pmus__scan()
336 list_for_each_entry_continue(pmu, &other_pmus, list) in perf_pmus__scan()
337 return pmu; in perf_pmus__scan()
341 struct perf_pmu *perf_pmus__scan_core(struct perf_pmu *pmu) in perf_pmus__scan_core() argument
343 if (!pmu) { in perf_pmus__scan_core()
345 return list_first_entry_or_null(&core_pmus, typeof(*pmu), list); in perf_pmus__scan_core()
347 list_for_each_entry_continue(pmu, &core_pmus, list) in perf_pmus__scan_core()
348 return pmu; in perf_pmus__scan_core()
353 static struct perf_pmu *perf_pmus__scan_skip_duplicates(struct perf_pmu *pmu) in perf_pmus__scan_skip_duplicates() argument
355 bool use_core_pmus = !pmu || pmu->is_core; in perf_pmus__scan_skip_duplicates()
357 const char *last_pmu_name = (pmu && pmu->name) ? pmu->name : ""; in perf_pmus__scan_skip_duplicates()
359 if (!pmu) { in perf_pmus__scan_skip_duplicates()
361 pmu = list_prepare_entry(pmu, &core_pmus, list); in perf_pmus__scan_skip_duplicates()
363 last_pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: ""); in perf_pmus__scan_skip_duplicates()
366 list_for_each_entry_continue(pmu, &core_pmus, list) { in perf_pmus__scan_skip_duplicates()
367 int pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: ""); in perf_pmus__scan_skip_duplicates()
370 !strncmp(last_pmu_name, pmu->name ?: "", pmu_name_len)) in perf_pmus__scan_skip_duplicates()
373 return pmu; in perf_pmus__scan_skip_duplicates()
375 pmu = NULL; in perf_pmus__scan_skip_duplicates()
376 pmu = list_prepare_entry(pmu, &other_pmus, list); in perf_pmus__scan_skip_duplicates()
378 list_for_each_entry_continue(pmu, &other_pmus, list) { in perf_pmus__scan_skip_duplicates()
379 int pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: ""); in perf_pmus__scan_skip_duplicates()
382 !strncmp(last_pmu_name, pmu->name ?: "", pmu_name_len)) in perf_pmus__scan_skip_duplicates()
385 return pmu; in perf_pmus__scan_skip_duplicates()
392 struct perf_pmu *pmu = NULL; in perf_pmus__pmu_for_pmu_filter() local
394 while ((pmu = perf_pmus__scan(pmu)) != NULL) { in perf_pmus__pmu_for_pmu_filter()
395 if (!strcmp(pmu->name, str)) in perf_pmus__pmu_for_pmu_filter()
396 return pmu; in perf_pmus__pmu_for_pmu_filter()
398 if (!strncmp(pmu->name, "uncore_", 7)) { in perf_pmus__pmu_for_pmu_filter()
399 if (!strcmp(pmu->name + 7, str)) in perf_pmus__pmu_for_pmu_filter()
400 return pmu; in perf_pmus__pmu_for_pmu_filter()
403 if (!strncmp(pmu->name, "cpu_", 4)) { in perf_pmus__pmu_for_pmu_filter()
404 if (!strcmp(pmu->name + 4, str)) in perf_pmus__pmu_for_pmu_filter()
405 return pmu; in perf_pmus__pmu_for_pmu_filter()
413 /** PMU for event. */
414 const struct perf_pmu *pmu; member
444 a_iscpu = as->pmu ? as->pmu->is_core : true; in cmp_sevent()
445 b_iscpu = bs->pmu ? bs->pmu->is_core : true; in cmp_sevent()
449 /* Order by PMU name. */ in cmp_sevent()
450 if (as->pmu != bs->pmu) { in cmp_sevent()
483 pr_err("Unexpected event %s/%s/\n", info->pmu->name, info->name); in perf_pmus__print_pmu_events__callback()
486 assert(info->pmu != NULL || info->name != NULL); in perf_pmus__print_pmu_events__callback()
488 s->pmu = info->pmu; in perf_pmus__print_pmu_events__callback()
507 struct perf_pmu *pmu; in perf_pmus__print_pmu_events() local
520 pmu = NULL; in perf_pmus__print_pmu_events()
522 while ((pmu = scan_fn(pmu)) != NULL) in perf_pmus__print_pmu_events()
523 len += perf_pmu__num_events(pmu); in perf_pmus__print_pmu_events()
527 pr_err("FATAL: not enough memory to print PMU events\n"); in perf_pmus__print_pmu_events()
530 pmu = NULL; in perf_pmus__print_pmu_events()
536 while ((pmu = scan_fn(pmu)) != NULL) { in perf_pmus__print_pmu_events()
537 perf_pmu__for_each_event(pmu, skip_duplicate_pmus, &state, in perf_pmus__print_pmu_events()
621 struct perf_pmu *pmu = NULL; in perf_pmus__print_raw_pmu_events() local
628 while ((pmu = scan_fn(pmu)) != NULL) { in perf_pmus__print_raw_pmu_events()
634 int len = pmu_name_len_no_suffix(pmu->name); in perf_pmus__print_raw_pmu_events()
637 if (!pmu->is_core) in perf_pmus__print_raw_pmu_events()
640 strbuf_addf(&format_args.short_string, "%.*s/", len, pmu->name); in perf_pmus__print_raw_pmu_events()
641 strbuf_addf(&format_args.long_string, "%.*s/", len, pmu->name); in perf_pmus__print_raw_pmu_events()
642 perf_pmu__for_each_format(pmu, &format_args, build_format_string); in perf_pmus__print_raw_pmu_events()
669 struct perf_pmu *pmu = perf_pmus__find(pname); in perf_pmus__have_event() local
671 return pmu && perf_pmu__have_event(pmu, name); in perf_pmus__have_event()
679 struct perf_pmu *pmu = NULL; in perf_pmus__num_core_pmus() local
681 while ((pmu = perf_pmus__scan_core(pmu)) != NULL) in perf_pmus__num_core_pmus()
689 struct perf_pmu *pmu = NULL; in __perf_pmus__supports_extended_type() local
694 while ((pmu = perf_pmus__scan_core(pmu)) != NULL) { in __perf_pmus__supports_extended_type()
695 …if (!is_event_supported(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES | ((__u64)pmu->type << PERF_P… in __perf_pmus__supports_extended_type()
720 struct perf_pmu *pmu = evsel->pmu; in evsel__find_pmu() local
723 if (pmu) in evsel__find_pmu()
724 return pmu; in evsel__find_pmu()
726 pmu = perf_pmus__find_by_type(evsel->core.attr.type); in evsel__find_pmu()
730 if (!pmu && legacy_core_type) { in evsel__find_pmu()
734 pmu = perf_pmus__find_by_type(type); in evsel__find_pmu()
736 pmu = perf_pmus__find_core_pmu(); in evsel__find_pmu()
739 ((struct evsel *)evsel)->pmu = pmu; in evsel__find_pmu()
740 return pmu; in evsel__find_pmu()
751 * Some PMU functions read from the sysfs mount point, so care is in perf_pmus__add_test_pmu()