Skip to content

Commit

Permalink
perf pmu: Add hybrid helper functions
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jin Yao authored and Arnaldo Carvalho de Melo committed Apr 29, 2021
1 parent 4446243 commit c5a26ea
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 0 deletions.
40 changes: 40 additions & 0 deletions tools/perf/util/pmu-hybrid.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
4 changes: 4 additions & 0 deletions tools/perf/util/pmu-hybrid.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
11 changes: 11 additions & 0 deletions tools/perf/util/pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
2 changes: 2 additions & 0 deletions tools/perf/util/pmu.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

0 comments on commit c5a26ea

Please sign in to comment.