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()
286 struct perf_pmu *pmu; in __perf_pmus__find_by_type() local
288 list_for_each_entry(pmu, &core_pmus, list) { in __perf_pmus__find_by_type()
289 if (pmu->type == type) in __perf_pmus__find_by_type()
290 return pmu; in __perf_pmus__find_by_type()
293 list_for_each_entry(pmu, &other_pmus, list) { in __perf_pmus__find_by_type()
294 if (pmu->type == type) in __perf_pmus__find_by_type()
295 return pmu; in __perf_pmus__find_by_type()
303 struct perf_pmu *pmu = __perf_pmus__find_by_type(type); in perf_pmus__find_by_type() local
305 if (pmu || (read_pmu_types == PERF_TOOL_PMU_TYPE_ALL_MASK)) in perf_pmus__find_by_type()
306 return pmu; in perf_pmus__find_by_type()
317 pmu = __perf_pmus__find_by_type(type); in perf_pmus__find_by_type()
318 return pmu; in perf_pmus__find_by_type()
322 * pmu iterator: If pmu is NULL, we start at the begin, otherwise return the
323 * next pmu. Returns NULL on end.
325 struct perf_pmu *perf_pmus__scan(struct perf_pmu *pmu) in perf_pmus__scan() argument
327 bool use_core_pmus = !pmu || pmu->is_core; in perf_pmus__scan()
329 if (!pmu) { in perf_pmus__scan()
331 pmu = list_prepare_entry(pmu, &core_pmus, list); in perf_pmus__scan()
334 list_for_each_entry_continue(pmu, &core_pmus, list) in perf_pmus__scan()
335 return pmu; in perf_pmus__scan()
337 pmu = NULL; in perf_pmus__scan()
338 pmu = list_prepare_entry(pmu, &other_pmus, list); in perf_pmus__scan()
340 list_for_each_entry_continue(pmu, &other_pmus, list) in perf_pmus__scan()
341 return pmu; in perf_pmus__scan()
345 struct perf_pmu *perf_pmus__scan_core(struct perf_pmu *pmu) in perf_pmus__scan_core() argument
347 if (!pmu) { in perf_pmus__scan_core()
349 return list_first_entry_or_null(&core_pmus, typeof(*pmu), list); in perf_pmus__scan_core()
351 list_for_each_entry_continue(pmu, &core_pmus, list) in perf_pmus__scan_core()
352 return pmu; in perf_pmus__scan_core()
357 static struct perf_pmu *perf_pmus__scan_skip_duplicates(struct perf_pmu *pmu) in perf_pmus__scan_skip_duplicates() argument
359 bool use_core_pmus = !pmu || pmu->is_core; in perf_pmus__scan_skip_duplicates()
361 const char *last_pmu_name = (pmu && pmu->name) ? pmu->name : ""; in perf_pmus__scan_skip_duplicates()
363 if (!pmu) { in perf_pmus__scan_skip_duplicates()
365 pmu = list_prepare_entry(pmu, &core_pmus, list); in perf_pmus__scan_skip_duplicates()
367 last_pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: ""); in perf_pmus__scan_skip_duplicates()
370 list_for_each_entry_continue(pmu, &core_pmus, list) { in perf_pmus__scan_skip_duplicates()
371 int pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: ""); in perf_pmus__scan_skip_duplicates()
374 !strncmp(last_pmu_name, pmu->name ?: "", pmu_name_len)) in perf_pmus__scan_skip_duplicates()
377 return pmu; in perf_pmus__scan_skip_duplicates()
379 pmu = NULL; in perf_pmus__scan_skip_duplicates()
380 pmu = list_prepare_entry(pmu, &other_pmus, list); in perf_pmus__scan_skip_duplicates()
382 list_for_each_entry_continue(pmu, &other_pmus, list) { in perf_pmus__scan_skip_duplicates()
383 int pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: ""); in perf_pmus__scan_skip_duplicates()
386 !strncmp(last_pmu_name, pmu->name ?: "", pmu_name_len)) in perf_pmus__scan_skip_duplicates()
389 return pmu; in perf_pmus__scan_skip_duplicates()
396 struct perf_pmu *pmu = NULL; in perf_pmus__pmu_for_pmu_filter() local
398 while ((pmu = perf_pmus__scan(pmu)) != NULL) { in perf_pmus__pmu_for_pmu_filter()
399 if (!strcmp(pmu->name, str)) in perf_pmus__pmu_for_pmu_filter()
400 return pmu; in perf_pmus__pmu_for_pmu_filter()
402 if (!strncmp(pmu->name, "uncore_", 7)) { in perf_pmus__pmu_for_pmu_filter()
403 if (!strcmp(pmu->name + 7, str)) in perf_pmus__pmu_for_pmu_filter()
404 return pmu; in perf_pmus__pmu_for_pmu_filter()
407 if (!strncmp(pmu->name, "cpu_", 4)) { in perf_pmus__pmu_for_pmu_filter()
408 if (!strcmp(pmu->name + 4, str)) in perf_pmus__pmu_for_pmu_filter()
409 return pmu; in perf_pmus__pmu_for_pmu_filter()
417 /** PMU for event. */
418 const struct perf_pmu *pmu; member
448 a_iscpu = as->pmu ? as->pmu->is_core : true; in cmp_sevent()
449 b_iscpu = bs->pmu ? bs->pmu->is_core : true; in cmp_sevent()
453 /* Order by PMU name. */ in cmp_sevent()
454 if (as->pmu != bs->pmu) { in cmp_sevent()
487 pr_err("Unexpected event %s/%s/\n", info->pmu->name, info->name); in perf_pmus__print_pmu_events__callback()
490 assert(info->pmu != NULL || info->name != NULL); in perf_pmus__print_pmu_events__callback()
492 s->pmu = info->pmu; in perf_pmus__print_pmu_events__callback()
511 struct perf_pmu *pmu; in perf_pmus__print_pmu_events() local
524 pmu = NULL; in perf_pmus__print_pmu_events()
526 while ((pmu = scan_fn(pmu)) != NULL) in perf_pmus__print_pmu_events()
527 len += perf_pmu__num_events(pmu); in perf_pmus__print_pmu_events()
531 pr_err("FATAL: not enough memory to print PMU events\n"); in perf_pmus__print_pmu_events()
534 pmu = NULL; in perf_pmus__print_pmu_events()
540 while ((pmu = scan_fn(pmu)) != NULL) { in perf_pmus__print_pmu_events()
541 perf_pmu__for_each_event(pmu, skip_duplicate_pmus, &state, in perf_pmus__print_pmu_events()
625 struct perf_pmu *pmu = NULL; in perf_pmus__print_raw_pmu_events() local
632 while ((pmu = scan_fn(pmu)) != NULL) { in perf_pmus__print_raw_pmu_events()
638 int len = pmu_name_len_no_suffix(pmu->name); in perf_pmus__print_raw_pmu_events()
641 if (!pmu->is_core) in perf_pmus__print_raw_pmu_events()
644 strbuf_addf(&format_args.short_string, "%.*s/", len, pmu->name); in perf_pmus__print_raw_pmu_events()
645 strbuf_addf(&format_args.long_string, "%.*s/", len, pmu->name); in perf_pmus__print_raw_pmu_events()
646 perf_pmu__for_each_format(pmu, &format_args, build_format_string); in perf_pmus__print_raw_pmu_events()
673 struct perf_pmu *pmu = perf_pmus__find(pname); in perf_pmus__have_event() local
675 return pmu && perf_pmu__have_event(pmu, name); in perf_pmus__have_event()
683 struct perf_pmu *pmu = NULL; in perf_pmus__num_core_pmus() local
685 while ((pmu = perf_pmus__scan_core(pmu)) != NULL) in perf_pmus__num_core_pmus()
693 struct perf_pmu *pmu = NULL; in __perf_pmus__supports_extended_type() local
698 while ((pmu = perf_pmus__scan_core(pmu)) != NULL) { in __perf_pmus__supports_extended_type()
699 …if (!is_event_supported(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES | ((__u64)pmu->type << PERF_P… in __perf_pmus__supports_extended_type()
757 struct perf_pmu *pmu = evsel->pmu; in evsel__find_pmu() local
760 if (pmu) in evsel__find_pmu()
761 return pmu; in evsel__find_pmu()
763 pmu = perf_pmus__find_by_type(evsel->core.attr.type); in evsel__find_pmu()
767 if (!pmu && legacy_core_type) { in evsel__find_pmu()
771 pmu = perf_pmus__find_by_type(type); in evsel__find_pmu()
773 pmu = perf_pmus__find_core_pmu(); in evsel__find_pmu()
776 ((struct evsel *)evsel)->pmu = pmu; in evsel__find_pmu()
777 return pmu; in evsel__find_pmu()
788 * Some PMU functions read from the sysfs mount point, so care is in perf_pmus__add_test_pmu()