perf pmu: Add hybrid helper functions

The functions perf_pmu__is_hybrid and perf_pmu__find_hybrid_pmu
can be used to identify the hybrid platform and return the found
hybrid cpu pmu. All the detected hybrid pmus have been saved in
'perf_pmu__hybrid_pmus' list. So we just need to search this list.

perf_pmu__hybrid_type_to_pmu converts the user specified string
to hybrid pmu name. This is used to support the '--cputype' option
in next patches.

perf_pmu__has_hybrid checks the existing of hybrid pmu. Note that,
we have to define it in pmu.c (make pmu-hybrid.c no more symbol
dependency), otherwise perf test python would be failed.

Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
Reviewed-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20210427070139.25256-7-yao.jin@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Jin Yao 2021-04-27 15:01:19 +08:00 committed by Arnaldo Carvalho de Melo
parent 444624307c
commit c5a26ea490
4 changed files with 57 additions and 0 deletions

View File

@ -47,3 +47,43 @@ bool perf_pmu__hybrid_mounted(const char *name)
return true;
}
struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name)
{
struct perf_pmu *pmu;
if (!name)
return NULL;
perf_pmu__for_each_hybrid_pmu(pmu) {
if (!strcmp(name, pmu->name))
return pmu;
}
return NULL;
}
bool perf_pmu__is_hybrid(const char *name)
{
return perf_pmu__find_hybrid_pmu(name) != NULL;
}
char *perf_pmu__hybrid_type_to_pmu(const char *type)
{
char *pmu_name = NULL;
if (asprintf(&pmu_name, "cpu_%s", type) < 0)
return NULL;
if (perf_pmu__is_hybrid(pmu_name))
return pmu_name;
/*
* pmu may be not scanned, check the sysfs.
*/
if (perf_pmu__hybrid_mounted(pmu_name))
return pmu_name;
free(pmu_name);
return NULL;
}

View File

@ -15,4 +15,8 @@ extern struct list_head perf_pmu__hybrid_pmus;
bool perf_pmu__hybrid_mounted(const char *name);
struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name);
bool perf_pmu__is_hybrid(const char *name);
char *perf_pmu__hybrid_type_to_pmu(const char *type);
#endif /* __PMU_HYBRID_H */

View File

@ -40,6 +40,7 @@ int perf_pmu_parse(struct list_head *list, char *name);
extern FILE *perf_pmu_in;
static LIST_HEAD(pmus);
static bool hybrid_scanned;
/*
* Parse & process all the sysfs attributes located under
@ -1861,3 +1862,13 @@ void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
"'%llx' not supported by kernel)!\n",
name ?: "N/A", buf, config);
}
bool perf_pmu__has_hybrid(void)
{
if (!hybrid_scanned) {
hybrid_scanned = true;
perf_pmu__scan(NULL);
}
return !list_empty(&perf_pmu__hybrid_pmus);
}

View File

@ -132,4 +132,6 @@ int perf_pmu__caps_parse(struct perf_pmu *pmu);
void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
char *name);
bool perf_pmu__has_hybrid(void);
#endif /* __PMU_H */