Merge branch 'akpm' (patches from Andrew)
[linux-2.6-microblaze.git] / tools / perf / util / pmu.c
index 5f486cc..bdabd62 100644 (file)
@@ -945,6 +945,18 @@ perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused)
        return NULL;
 }
 
+char * __weak
+pmu_find_real_name(const char *name)
+{
+       return (char *)name;
+}
+
+char * __weak
+pmu_find_alias_name(const char *name __maybe_unused)
+{
+       return NULL;
+}
+
 static int pmu_max_precise(const char *name)
 {
        char path[PATH_MAX];
@@ -958,13 +970,15 @@ static int pmu_max_precise(const char *name)
        return max_precise;
 }
 
-static struct perf_pmu *pmu_lookup(const char *name)
+static struct perf_pmu *pmu_lookup(const char *lookup_name)
 {
        struct perf_pmu *pmu;
        LIST_HEAD(format);
        LIST_HEAD(aliases);
        __u32 type;
+       char *name = pmu_find_real_name(lookup_name);
        bool is_hybrid = perf_pmu__hybrid_mounted(name);
+       char *alias_name;
 
        /*
         * Check pmu name for hybrid and the pmu may be invalid in sysfs
@@ -995,6 +1009,16 @@ static struct perf_pmu *pmu_lookup(const char *name)
 
        pmu->cpus = pmu_cpumask(name);
        pmu->name = strdup(name);
+       if (!pmu->name)
+               goto err;
+
+       alias_name = pmu_find_alias_name(name);
+       if (alias_name) {
+               pmu->alias_name = strdup(alias_name);
+               if (!pmu->alias_name)
+                       goto err;
+       }
+
        pmu->type = type;
        pmu->is_uncore = pmu_is_uncore(name);
        if (pmu->is_uncore)
@@ -1017,15 +1041,22 @@ static struct perf_pmu *pmu_lookup(const char *name)
        pmu->default_config = perf_pmu__get_default_config(pmu);
 
        return pmu;
+err:
+       if (pmu->name)
+               free(pmu->name);
+       free(pmu);
+       return NULL;
 }
 
 static struct perf_pmu *pmu_find(const char *name)
 {
        struct perf_pmu *pmu;
 
-       list_for_each_entry(pmu, &pmus, list)
-               if (!strcmp(pmu->name, name))
+       list_for_each_entry(pmu, &pmus, list) {
+               if (!strcmp(pmu->name, name) ||
+                   (pmu->alias_name && !strcmp(pmu->alias_name, name)))
                        return pmu;
+       }
 
        return NULL;
 }
@@ -1919,6 +1950,9 @@ bool perf_pmu__has_hybrid(void)
 
 int perf_pmu__match(char *pattern, char *name, char *tok)
 {
+       if (!name)
+               return -1;
+
        if (fnmatch(pattern, name, 0))
                return -1;