Lines Matching full:pmu
17 #include "pmu.h"
21 * core_pmus: A PMU belongs to core_pmus if it's name is "cpu" or it's sysfs
23 * must have pmu->is_core=1. If there are more than one PMU in
26 * homogeneous PMU, and thus they are treated as homogeneous
29 * matter whether PMU is present per SMT-thread or outside of the
33 * must have pmu->is_core=0 but pmu->is_uncore could be 0 or 1.
69 struct perf_pmu *pmu, *tmp; in perf_pmus__destroy() local
71 list_for_each_entry_safe(pmu, tmp, &core_pmus, list) { in perf_pmus__destroy()
72 list_del(&pmu->list); in perf_pmus__destroy()
74 perf_pmu__delete(pmu); in perf_pmus__destroy()
76 list_for_each_entry_safe(pmu, tmp, &other_pmus, list) { in perf_pmus__destroy()
77 list_del(&pmu->list); in perf_pmus__destroy()
79 perf_pmu__delete(pmu); in perf_pmus__destroy()
87 struct perf_pmu *pmu; in pmu_find() local
89 list_for_each_entry(pmu, &core_pmus, list) { in pmu_find()
90 if (!strcmp(pmu->name, name) || in pmu_find()
91 (pmu->alias_name && !strcmp(pmu->alias_name, name))) in pmu_find()
92 return pmu; in pmu_find()
94 list_for_each_entry(pmu, &other_pmus, list) { in pmu_find()
95 if (!strcmp(pmu->name, name) || in pmu_find()
96 (pmu->alias_name && !strcmp(pmu->alias_name, name))) in pmu_find()
97 return pmu; in pmu_find()
105 struct perf_pmu *pmu; in perf_pmus__find() local
110 * Once PMU is loaded it stays in the list, in perf_pmus__find()
112 * the pmu format definitions. in perf_pmus__find()
114 pmu = pmu_find(name); in perf_pmus__find()
115 if (pmu) in perf_pmus__find()
116 return pmu; in perf_pmus__find()
126 pmu = perf_pmu__lookup(core_pmu ? &core_pmus : &other_pmus, dirfd, name); in perf_pmus__find()
129 if (!pmu) { in perf_pmus__find()
131 * Looking up an inidividual PMU failed. This may mean name is in perf_pmus__find()
135 pmu = pmu_find(name); in perf_pmus__find()
137 return pmu; in perf_pmus__find()
142 struct perf_pmu *pmu; in perf_pmu__find2() local
146 * Once PMU is loaded it stays in the list, in perf_pmu__find2()
148 * the pmu format definitions. in perf_pmu__find2()
150 pmu = pmu_find(name); in perf_pmu__find2()
151 if (pmu) in perf_pmu__find2()
152 return pmu; in perf_pmu__find2()
183 /* Add all pmus in sysfs to pmu list: */
228 struct perf_pmu *pmu; in __perf_pmus__find_by_type() local
230 list_for_each_entry(pmu, &core_pmus, list) { in __perf_pmus__find_by_type()
231 if (pmu->type == type) in __perf_pmus__find_by_type()
232 return pmu; in __perf_pmus__find_by_type()
235 list_for_each_entry(pmu, &other_pmus, list) { in __perf_pmus__find_by_type()
236 if (pmu->type == type) in __perf_pmus__find_by_type()
237 return pmu; in __perf_pmus__find_by_type()
244 struct perf_pmu *pmu = __perf_pmus__find_by_type(type); in perf_pmus__find_by_type() local
246 if (pmu || read_sysfs_all_pmus) in perf_pmus__find_by_type()
247 return pmu; in perf_pmus__find_by_type()
250 pmu = __perf_pmus__find_by_type(type); in perf_pmus__find_by_type()
251 return pmu; in perf_pmus__find_by_type()
255 * pmu iterator: If pmu is NULL, we start at the begin, otherwise return the
256 * next pmu. Returns NULL on end.
258 struct perf_pmu *perf_pmus__scan(struct perf_pmu *pmu) in perf_pmus__scan() argument
260 bool use_core_pmus = !pmu || pmu->is_core; in perf_pmus__scan()
262 if (!pmu) { in perf_pmus__scan()
264 pmu = list_prepare_entry(pmu, &core_pmus, list); in perf_pmus__scan()
267 list_for_each_entry_continue(pmu, &core_pmus, list) in perf_pmus__scan()
268 return pmu; in perf_pmus__scan()
270 pmu = NULL; in perf_pmus__scan()
271 pmu = list_prepare_entry(pmu, &other_pmus, list); in perf_pmus__scan()
273 list_for_each_entry_continue(pmu, &other_pmus, list) in perf_pmus__scan()
274 return pmu; in perf_pmus__scan()
278 struct perf_pmu *perf_pmus__scan_core(struct perf_pmu *pmu) in perf_pmus__scan_core() argument
280 if (!pmu) { in perf_pmus__scan_core()
282 return list_first_entry_or_null(&core_pmus, typeof(*pmu), list); in perf_pmus__scan_core()
284 list_for_each_entry_continue(pmu, &core_pmus, list) in perf_pmus__scan_core()
285 return pmu; in perf_pmus__scan_core()
290 static struct perf_pmu *perf_pmus__scan_skip_duplicates(struct perf_pmu *pmu) in perf_pmus__scan_skip_duplicates() argument
292 bool use_core_pmus = !pmu || pmu->is_core; in perf_pmus__scan_skip_duplicates()
294 const char *last_pmu_name = (pmu && pmu->name) ? pmu->name : ""; in perf_pmus__scan_skip_duplicates()
296 if (!pmu) { in perf_pmus__scan_skip_duplicates()
298 pmu = list_prepare_entry(pmu, &core_pmus, list); in perf_pmus__scan_skip_duplicates()
300 last_pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: "", NULL); in perf_pmus__scan_skip_duplicates()
303 list_for_each_entry_continue(pmu, &core_pmus, list) { in perf_pmus__scan_skip_duplicates()
304 int pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: "", /*num=*/NULL); in perf_pmus__scan_skip_duplicates()
307 !strncmp(last_pmu_name, pmu->name ?: "", pmu_name_len)) in perf_pmus__scan_skip_duplicates()
310 return pmu; in perf_pmus__scan_skip_duplicates()
312 pmu = NULL; in perf_pmus__scan_skip_duplicates()
313 pmu = list_prepare_entry(pmu, &other_pmus, list); in perf_pmus__scan_skip_duplicates()
315 list_for_each_entry_continue(pmu, &other_pmus, list) { in perf_pmus__scan_skip_duplicates()
316 int pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: "", /*num=*/NULL); in perf_pmus__scan_skip_duplicates()
319 !strncmp(last_pmu_name, pmu->name ?: "", pmu_name_len)) in perf_pmus__scan_skip_duplicates()
322 return pmu; in perf_pmus__scan_skip_duplicates()
329 struct perf_pmu *pmu = NULL; in perf_pmus__pmu_for_pmu_filter() local
331 while ((pmu = perf_pmus__scan(pmu)) != NULL) { in perf_pmus__pmu_for_pmu_filter()
332 if (!strcmp(pmu->name, str)) in perf_pmus__pmu_for_pmu_filter()
333 return pmu; in perf_pmus__pmu_for_pmu_filter()
335 if (!strncmp(pmu->name, "uncore_", 7)) { in perf_pmus__pmu_for_pmu_filter()
336 if (!strcmp(pmu->name + 7, str)) in perf_pmus__pmu_for_pmu_filter()
337 return pmu; in perf_pmus__pmu_for_pmu_filter()
340 if (!strncmp(pmu->name, "cpu_", 4)) { in perf_pmus__pmu_for_pmu_filter()
341 if (!strcmp(pmu->name + 4, str)) in perf_pmus__pmu_for_pmu_filter()
342 return pmu; in perf_pmus__pmu_for_pmu_filter()
356 /** PMU for event. */
357 const struct perf_pmu *pmu; member
386 a_iscpu = as->pmu ? as->pmu->is_core : true; in cmp_sevent()
387 b_iscpu = bs->pmu ? bs->pmu->is_core : true; in cmp_sevent()
391 /* Order by PMU name. */ in cmp_sevent()
392 if (as->pmu != bs->pmu) { in cmp_sevent()
425 pr_err("Unexpected event %s/%s/\n", info->pmu->name, info->name); in perf_pmus__print_pmu_events__callback()
429 s->pmu = info->pmu; in perf_pmus__print_pmu_events__callback()
447 struct perf_pmu *pmu; in perf_pmus__print_pmu_events() local
460 pmu = NULL; in perf_pmus__print_pmu_events()
462 while ((pmu = scan_fn(pmu)) != NULL) in perf_pmus__print_pmu_events()
463 len += perf_pmu__num_events(pmu); in perf_pmus__print_pmu_events()
467 pr_err("FATAL: not enough memory to print PMU events\n"); in perf_pmus__print_pmu_events()
470 pmu = NULL; in perf_pmus__print_pmu_events()
476 while ((pmu = scan_fn(pmu)) != NULL) { in perf_pmus__print_pmu_events()
477 perf_pmu__for_each_event(pmu, skip_duplicate_pmus, &state, in perf_pmus__print_pmu_events()
493 "Kernel PMU event", in perf_pmus__print_pmu_events()
514 struct perf_pmu *pmu = perf_pmus__find(pname); in perf_pmus__have_event() local
516 return pmu && perf_pmu__have_event(pmu, name); in perf_pmus__have_event()
524 struct perf_pmu *pmu = NULL; in perf_pmus__num_core_pmus() local
526 while ((pmu = perf_pmus__scan_core(pmu)) != NULL) in perf_pmus__num_core_pmus()
534 struct perf_pmu *pmu = NULL; in __perf_pmus__supports_extended_type() local
539 while ((pmu = perf_pmus__scan_core(pmu)) != NULL) { in __perf_pmus__supports_extended_type()
540 …if (!is_event_supported(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES | ((__u64)pmu->type << PERF_P… in __perf_pmus__supports_extended_type()
598 struct perf_pmu *pmu = evsel->pmu; in evsel__find_pmu() local
600 if (!pmu) { in evsel__find_pmu()
601 pmu = perf_pmus__find_by_type(evsel->core.attr.type); in evsel__find_pmu()
602 ((struct evsel *)evsel)->pmu = pmu; in evsel__find_pmu()
604 return pmu; in evsel__find_pmu()