Lines Matching refs:pmu

17 #include "pmu.h"
23 * must have pmu->is_core=1. If there are more than one PMU in
33 * must have pmu->is_core=0 but pmu->is_uncore could be 0 or 1.
69 struct perf_pmu *pmu, *tmp;
71 list_for_each_entry_safe(pmu, tmp, &core_pmus, list) {
72 list_del(&pmu->list);
74 perf_pmu__delete(pmu);
76 list_for_each_entry_safe(pmu, tmp, &other_pmus, list) {
77 list_del(&pmu->list);
79 perf_pmu__delete(pmu);
87 struct perf_pmu *pmu;
89 list_for_each_entry(pmu, &core_pmus, list) {
90 if (!strcmp(pmu->name, name) ||
91 (pmu->alias_name && !strcmp(pmu->alias_name, name)))
92 return pmu;
94 list_for_each_entry(pmu, &other_pmus, list) {
95 if (!strcmp(pmu->name, name) ||
96 (pmu->alias_name && !strcmp(pmu->alias_name, name)))
97 return pmu;
105 struct perf_pmu *pmu;
112 * the pmu format definitions.
114 pmu = pmu_find(name);
115 if (pmu)
116 return pmu;
126 pmu = perf_pmu__lookup(core_pmu ? &core_pmus : &other_pmus, dirfd, name);
129 if (!pmu) {
135 pmu = pmu_find(name);
137 return pmu;
142 struct perf_pmu *pmu;
148 * the pmu format definitions.
150 pmu = pmu_find(name);
151 if (pmu)
152 return pmu;
183 /* Add all pmus in sysfs to pmu list: */
228 struct perf_pmu *pmu;
230 list_for_each_entry(pmu, &core_pmus, list) {
231 if (pmu->type == type)
232 return pmu;
235 list_for_each_entry(pmu, &other_pmus, list) {
236 if (pmu->type == type)
237 return pmu;
244 struct perf_pmu *pmu = __perf_pmus__find_by_type(type);
246 if (pmu || read_sysfs_all_pmus)
247 return pmu;
250 pmu = __perf_pmus__find_by_type(type);
251 return pmu;
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)
260 bool use_core_pmus = !pmu || pmu->is_core;
262 if (!pmu) {
264 pmu = list_prepare_entry(pmu, &core_pmus, list);
267 list_for_each_entry_continue(pmu, &core_pmus, list)
268 return pmu;
270 pmu = NULL;
271 pmu = list_prepare_entry(pmu, &other_pmus, list);
273 list_for_each_entry_continue(pmu, &other_pmus, list)
274 return pmu;
278 struct perf_pmu *perf_pmus__scan_core(struct perf_pmu *pmu)
280 if (!pmu) {
282 return list_first_entry_or_null(&core_pmus, typeof(*pmu), list);
284 list_for_each_entry_continue(pmu, &core_pmus, list)
285 return pmu;
290 static struct perf_pmu *perf_pmus__scan_skip_duplicates(struct perf_pmu *pmu)
292 bool use_core_pmus = !pmu || pmu->is_core;
294 const char *last_pmu_name = (pmu && pmu->name) ? pmu->name : "";
296 if (!pmu) {
298 pmu = list_prepare_entry(pmu, &core_pmus, list);
300 last_pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: "", NULL);
303 list_for_each_entry_continue(pmu, &core_pmus, list) {
304 int pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: "", /*num=*/NULL);
307 !strncmp(last_pmu_name, pmu->name ?: "", pmu_name_len))
310 return pmu;
312 pmu = NULL;
313 pmu = list_prepare_entry(pmu, &other_pmus, list);
315 list_for_each_entry_continue(pmu, &other_pmus, list) {
316 int pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: "", /*num=*/NULL);
319 !strncmp(last_pmu_name, pmu->name ?: "", pmu_name_len))
322 return pmu;
329 struct perf_pmu *pmu = NULL;
331 while ((pmu = perf_pmus__scan(pmu)) != NULL) {
332 if (!strcmp(pmu->name, str))
333 return pmu;
335 if (!strncmp(pmu->name, "uncore_", 7)) {
336 if (!strcmp(pmu->name + 7, str))
337 return pmu;
340 if (!strncmp(pmu->name, "cpu_", 4)) {
341 if (!strcmp(pmu->name + 4, str))
342 return pmu;
351 const struct perf_pmu *pmu;
380 a_iscpu = as->pmu ? as->pmu->is_core : true;
381 b_iscpu = bs->pmu ? bs->pmu->is_core : true;
386 if (as->pmu != bs->pmu) {
419 pr_err("Unexpected event %s/%s/\n", info->pmu->name, info->name);
423 s->pmu = info->pmu;
441 struct perf_pmu *pmu;
454 pmu = NULL;
456 while ((pmu = scan_fn(pmu)) != NULL)
457 len += perf_pmu__num_events(pmu);
464 pmu = NULL;
470 while ((pmu = scan_fn(pmu)) != NULL) {
471 perf_pmu__for_each_event(pmu, skip_duplicate_pmus, &state,
508 struct perf_pmu *pmu = perf_pmus__find(pname);
510 return pmu && perf_pmu__have_event(pmu, name);
518 struct perf_pmu *pmu = NULL;
520 while ((pmu = perf_pmus__scan_core(pmu)) != NULL)
528 struct perf_pmu *pmu = NULL;
533 while ((pmu = perf_pmus__scan_core(pmu)) != NULL) {
534 if (!is_event_supported(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES | ((__u64)pmu->type << PERF_PMU_TYPE_SHIFT)))
592 struct perf_pmu *pmu = evsel->pmu;
594 if (!pmu) {
595 pmu = perf_pmus__find_by_type(evsel->core.attr.type);
596 ((struct evsel *)evsel)->pmu = pmu;
598 return pmu;