Lines Matching refs:pmu
16 #include "pmu.h"
22 * must have pmu->is_core=1. If there are more than one PMU in
32 * must have pmu->is_core=0 but pmu->is_uncore could be 0 or 1.
66 struct perf_pmu *pmu, *tmp;
68 list_for_each_entry_safe(pmu, tmp, &core_pmus, list) {
69 list_del(&pmu->list);
71 perf_pmu__delete(pmu);
73 list_for_each_entry_safe(pmu, tmp, &other_pmus, list) {
74 list_del(&pmu->list);
76 perf_pmu__delete(pmu);
84 struct perf_pmu *pmu;
86 list_for_each_entry(pmu, &core_pmus, list) {
87 if (!strcmp(pmu->name, name) ||
88 (pmu->alias_name && !strcmp(pmu->alias_name, name)))
89 return pmu;
91 list_for_each_entry(pmu, &other_pmus, list) {
92 if (!strcmp(pmu->name, name) ||
93 (pmu->alias_name && !strcmp(pmu->alias_name, name)))
94 return pmu;
102 struct perf_pmu *pmu;
109 * the pmu format definitions.
111 pmu = pmu_find(name);
112 if (pmu)
113 return pmu;
123 pmu = perf_pmu__lookup(core_pmu ? &core_pmus : &other_pmus, dirfd, name);
126 return pmu;
131 struct perf_pmu *pmu;
137 * the pmu format definitions.
139 pmu = pmu_find(name);
140 if (pmu)
141 return pmu;
172 /* Add all pmus in sysfs to pmu list: */
217 struct perf_pmu *pmu;
219 list_for_each_entry(pmu, &core_pmus, list) {
220 if (pmu->type == type)
221 return pmu;
224 list_for_each_entry(pmu, &other_pmus, list) {
225 if (pmu->type == type)
226 return pmu;
233 struct perf_pmu *pmu = __perf_pmus__find_by_type(type);
235 if (pmu || read_sysfs_all_pmus)
236 return pmu;
239 pmu = __perf_pmus__find_by_type(type);
240 return pmu;
244 * pmu iterator: If pmu is NULL, we start at the begin, otherwise return the
245 * next pmu. Returns NULL on end.
247 struct perf_pmu *perf_pmus__scan(struct perf_pmu *pmu)
249 bool use_core_pmus = !pmu || pmu->is_core;
251 if (!pmu) {
253 pmu = list_prepare_entry(pmu, &core_pmus, list);
256 list_for_each_entry_continue(pmu, &core_pmus, list)
257 return pmu;
259 pmu = NULL;
260 pmu = list_prepare_entry(pmu, &other_pmus, list);
262 list_for_each_entry_continue(pmu, &other_pmus, list)
263 return pmu;
267 struct perf_pmu *perf_pmus__scan_core(struct perf_pmu *pmu)
269 if (!pmu) {
271 pmu = list_prepare_entry(pmu, &core_pmus, list);
273 list_for_each_entry_continue(pmu, &core_pmus, list)
274 return pmu;
279 static struct perf_pmu *perf_pmus__scan_skip_duplicates(struct perf_pmu *pmu)
281 bool use_core_pmus = !pmu || pmu->is_core;
283 const char *last_pmu_name = (pmu && pmu->name) ? pmu->name : "";
285 if (!pmu) {
287 pmu = list_prepare_entry(pmu, &core_pmus, list);
289 last_pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: "", NULL);
292 list_for_each_entry_continue(pmu, &core_pmus, list) {
293 int pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: "", /*num=*/NULL);
296 !strncmp(last_pmu_name, pmu->name ?: "", pmu_name_len))
299 return pmu;
301 pmu = NULL;
302 pmu = list_prepare_entry(pmu, &other_pmus, list);
304 list_for_each_entry_continue(pmu, &other_pmus, list) {
305 int pmu_name_len = pmu_name_len_no_suffix(pmu->name ?: "", /*num=*/NULL);
308 !strncmp(last_pmu_name, pmu->name ?: "", pmu_name_len))
311 return pmu;
318 struct perf_pmu *pmu = NULL;
320 while ((pmu = perf_pmus__scan(pmu)) != NULL) {
321 if (!strcmp(pmu->name, str))
322 return pmu;
324 if (!strncmp(pmu->name, "uncore_", 7)) {
325 if (!strcmp(pmu->name + 7, str))
326 return pmu;
329 if (!strncmp(pmu->name, "cpu_", 4)) {
330 if (!strcmp(pmu->name + 4, str))
331 return pmu;
346 const struct perf_pmu *pmu;
375 a_iscpu = as->pmu ? as->pmu->is_core : true;
376 b_iscpu = bs->pmu ? bs->pmu->is_core : true;
381 if (as->pmu != bs->pmu) {
414 pr_err("Unexpected event %s/%s/\n", info->pmu->name, info->name);
418 s->pmu = info->pmu;
436 struct perf_pmu *pmu;
449 pmu = NULL;
451 while ((pmu = scan_fn(pmu)) != NULL)
452 len += perf_pmu__num_events(pmu);
459 pmu = NULL;
465 while ((pmu = scan_fn(pmu)) != NULL) {
466 perf_pmu__for_each_event(pmu, skip_duplicate_pmus, &state,
503 struct perf_pmu *pmu = perf_pmus__find(pname);
505 return pmu && perf_pmu__have_event(pmu, name);
513 struct perf_pmu *pmu = NULL;
515 while ((pmu = perf_pmus__scan_core(pmu)) != NULL)
523 struct perf_pmu *pmu = NULL;
528 while ((pmu = perf_pmus__scan_core(pmu)) != NULL) {
529 if (!is_event_supported(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES | ((__u64)pmu->type << PERF_PMU_TYPE_SHIFT)))
587 struct perf_pmu *pmu = evsel->pmu;
589 if (!pmu) {
590 pmu = perf_pmus__find_by_type(evsel->core.attr.type);
591 ((struct evsel *)evsel)->pmu = pmu;
593 return pmu;