From: Andi Kleen <[email protected]>

Add the basic code to parse an .aggr-per-core event attribute.
The attribute means that the event needs to be measured in
per core mode.

v2: Support integer values for aggr-per-core
Signed-off-by: Andi Kleen <[email protected]>
---
 tools/perf/util/evsel.h        |  1 +
 tools/perf/util/parse-events.c |  1 +
 tools/perf/util/pmu.c          | 24 ++++++++++++++++++++++++
 tools/perf/util/pmu.h          |  2 ++
 4 files changed, 28 insertions(+)

diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 501ea6e565f1..8a746d2df152 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -112,6 +112,7 @@ struct perf_evsel {
        bool                    tracking;
        bool                    per_pkg;
        bool                    precise_max;
+       int                     aggr_per_core;
        /* parse modifier helper */
        int                     exclude_GH;
        int                     nr_members;
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 4c19d5e79d8c..efa77179195c 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1213,6 +1213,7 @@ int parse_events_add_pmu(struct parse_events_evlist *data,
                evsel->unit = info.unit;
                evsel->scale = info.scale;
                evsel->per_pkg = info.per_pkg;
+               evsel->aggr_per_core = info.aggr_per_core;
                evsel->snapshot = info.snapshot;
        }
 
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index adef23b1352e..38f4d13dfca0 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -202,6 +202,24 @@ perf_pmu__parse_per_pkg(struct perf_pmu_alias *alias, char 
*dir, char *name)
        return 0;
 }
 
+static void
+perf_pmu__parse_aggr_per_core(struct perf_pmu_alias *alias, char *dir, char 
*name)
+{
+       char path[PATH_MAX];
+       FILE *f;
+       int flag;
+
+       snprintf(path, PATH_MAX, "%s/%s.aggr-per-core", dir, name);
+
+       f = fopen(path, "r");
+       if (f) {
+               if (fscanf(f, "%d", &flag) == 1)
+                       alias->aggr_per_core = flag;
+               fclose(f);
+       }
+}
+
+
 static int perf_pmu__parse_snapshot(struct perf_pmu_alias *alias,
                                    char *dir, char *name)
 {
@@ -251,6 +269,7 @@ static int __perf_pmu__new_alias(struct list_head *list, 
char *dir, char *name,
                perf_pmu__parse_scale(alias, dir, name);
                perf_pmu__parse_per_pkg(alias, dir, name);
                perf_pmu__parse_snapshot(alias, dir, name);
+               perf_pmu__parse_aggr_per_core(alias, dir, name);
        }
 
        list_add_tail(&alias->list, list);
@@ -285,6 +304,8 @@ static inline bool pmu_alias_info_file(char *name)
                return true;
        if (len > 9 && !strcmp(name + len - 9, ".snapshot"))
                return true;
+       if (len > 14 && !strcmp(name + len - 14, ".aggr-per-core"))
+               return true;
 
        return false;
 }
@@ -864,6 +885,7 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct 
list_head *head_terms,
        int ret;
 
        info->per_pkg = false;
+       info->aggr_per_core = 0;
 
        /*
         * Mark unit and scale as not set
@@ -887,6 +909,8 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct 
list_head *head_terms,
 
                if (alias->per_pkg)
                        info->per_pkg = true;
+               if (alias->aggr_per_core)
+                       info->aggr_per_core = alias->aggr_per_core;
 
                list_del(&term->list);
                free(term);
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
index 5d7e84466bee..95e9e64f9e76 100644
--- a/tools/perf/util/pmu.h
+++ b/tools/perf/util/pmu.h
@@ -32,6 +32,7 @@ struct perf_pmu_info {
        double scale;
        bool per_pkg;
        bool snapshot;
+       int  aggr_per_core;
 };
 
 #define UNIT_MAX_LEN   31 /* max length for event unit name */
@@ -44,6 +45,7 @@ struct perf_pmu_alias {
        double scale;
        bool per_pkg;
        bool snapshot;
+       bool aggr_per_core;
 };
 
 struct perf_pmu *perf_pmu__find(const char *name);
-- 
2.5.5

Reply via email to