Commit c5a26ea4 authored by Jin Yao's avatar Jin Yao Committed by Arnaldo Carvalho de Melo

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: default avatarJin Yao <yao.jin@linux.intel.com>
Reviewed-by: default avatarJiri 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.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 44462430
...@@ -47,3 +47,43 @@ bool perf_pmu__hybrid_mounted(const char *name) ...@@ -47,3 +47,43 @@ bool perf_pmu__hybrid_mounted(const char *name)
return true; 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;
}
...@@ -15,4 +15,8 @@ extern struct list_head perf_pmu__hybrid_pmus; ...@@ -15,4 +15,8 @@ extern struct list_head perf_pmu__hybrid_pmus;
bool perf_pmu__hybrid_mounted(const char *name); 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 */ #endif /* __PMU_HYBRID_H */
...@@ -40,6 +40,7 @@ int perf_pmu_parse(struct list_head *list, char *name); ...@@ -40,6 +40,7 @@ int perf_pmu_parse(struct list_head *list, char *name);
extern FILE *perf_pmu_in; extern FILE *perf_pmu_in;
static LIST_HEAD(pmus); static LIST_HEAD(pmus);
static bool hybrid_scanned;
/* /*
* Parse & process all the sysfs attributes located under * Parse & process all the sysfs attributes located under
...@@ -1861,3 +1862,13 @@ void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config, ...@@ -1861,3 +1862,13 @@ void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
"'%llx' not supported by kernel)!\n", "'%llx' not supported by kernel)!\n",
name ?: "N/A", buf, config); 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);
}
...@@ -132,4 +132,6 @@ int perf_pmu__caps_parse(struct perf_pmu *pmu); ...@@ -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, void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
char *name); char *name);
bool perf_pmu__has_hybrid(void);
#endif /* __PMU_H */ #endif /* __PMU_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment