On hybrid platform, one event is available on one pmu
(such as, available on cpu_core or on cpu_atom).

This patch saves the pmu name to the pmu field of struct perf_pmu_alias.
Then next we can know the pmu which the event can be enabled on.

Signed-off-by: Jin Yao <yao....@linux.intel.com>
---
v3:
 - Change pmu to pmu_name in struct perf_pmu_alias.

 tools/perf/util/pmu.c | 10 +++++++++-
 tools/perf/util/pmu.h |  1 +
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 9ed9a6a8b2d2..10709ec1cc3e 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -283,6 +283,7 @@ void perf_pmu_free_alias(struct perf_pmu_alias *newalias)
        zfree(&newalias->str);
        zfree(&newalias->metric_expr);
        zfree(&newalias->metric_name);
+       zfree(&newalias->pmu_name);
        parse_events_terms__purge(&newalias->terms);
        free(newalias);
 }
@@ -297,6 +298,10 @@ static bool perf_pmu_merge_alias(struct perf_pmu_alias 
*newalias,
 
        list_for_each_entry(a, alist, list) {
                if (!strcasecmp(newalias->name, a->name)) {
+                       if (newalias->pmu_name && a->pmu_name &&
+                           !strcasecmp(newalias->pmu_name, a->pmu_name)) {
+                               continue;
+                       }
                        perf_pmu_update_alias(a, newalias);
                        perf_pmu_free_alias(newalias);
                        return true;
@@ -314,7 +319,8 @@ static int __perf_pmu__new_alias(struct list_head *list, 
char *dir, char *name,
        int num;
        char newval[256];
        char *long_desc = NULL, *topic = NULL, *unit = NULL, *perpkg = NULL,
-            *metric_expr = NULL, *metric_name = NULL, *deprecated = NULL;
+            *metric_expr = NULL, *metric_name = NULL, *deprecated = NULL,
+            *pmu_name = NULL;
 
        if (pe) {
                long_desc = (char *)pe->long_desc;
@@ -324,6 +330,7 @@ static int __perf_pmu__new_alias(struct list_head *list, 
char *dir, char *name,
                metric_expr = (char *)pe->metric_expr;
                metric_name = (char *)pe->metric_name;
                deprecated = (char *)pe->deprecated;
+               pmu_name = (char *)pe->pmu;
        }
 
        alias = malloc(sizeof(*alias));
@@ -389,6 +396,7 @@ static int __perf_pmu__new_alias(struct list_head *list, 
char *dir, char *name,
        }
        alias->per_pkg = perpkg && sscanf(perpkg, "%d", &num) == 1 && num == 1;
        alias->str = strdup(newval);
+       alias->pmu_name = pmu_name ? strdup(pmu_name) : NULL;
 
        if (deprecated)
                alias->deprecated = true;
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
index 8164388478c6..8493b1719e10 100644
--- a/tools/perf/util/pmu.h
+++ b/tools/perf/util/pmu.h
@@ -72,6 +72,7 @@ struct perf_pmu_alias {
        bool deprecated;
        char *metric_expr;
        char *metric_name;
+       char *pmu_name;
 };
 
 struct perf_pmu *perf_pmu__find(const char *name);
-- 
2.17.1

Reply via email to