diff options
author | Jiri Olsa <jolsa@redhat.com> | 2015-06-04 09:50:55 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-06-08 09:30:30 -0400 |
commit | e2f56da1d6670070f6f55d43007cb7b03ee04c2f (patch) | |
tree | 370c939f0fbba94fe15ace10d7dd515a1b0b3ce7 | |
parent | a3d86542de8850be52e8589da22b24002941dfb7 (diff) |
perf stat: Add id into perf_stat struct
We need fast way to identify evsel as transaction event for shadow
counters computation. Currently we are using possition (in evlist) based
way.
Adding 'id' into 'struct perf_stat' so it can carry transaction event ID
and we can use it for shadow counters computations.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/20150604135055.GB23625@krava.redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/builtin-stat.c | 6 | ||||
-rw-r--r-- | tools/perf/util/stat.c | 31 | ||||
-rw-r--r-- | tools/perf/util/stat.h | 20 |
3 files changed, 52 insertions, 5 deletions
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index fd577f725d23..a6ae1007f1f9 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
@@ -147,10 +147,6 @@ static int (*aggr_get_id)(struct cpu_map *m, int cpu); | |||
147 | 147 | ||
148 | static volatile int done = 0; | 148 | static volatile int done = 0; |
149 | 149 | ||
150 | struct perf_stat { | ||
151 | struct stats res_stats[3]; | ||
152 | }; | ||
153 | |||
154 | static inline void diff_timespec(struct timespec *r, struct timespec *a, | 150 | static inline void diff_timespec(struct timespec *r, struct timespec *a, |
155 | struct timespec *b) | 151 | struct timespec *b) |
156 | { | 152 | { |
@@ -180,6 +176,8 @@ static void perf_evsel__reset_stat_priv(struct perf_evsel *evsel) | |||
180 | 176 | ||
181 | for (i = 0; i < 3; i++) | 177 | for (i = 0; i < 3; i++) |
182 | init_stats(&ps->res_stats[i]); | 178 | init_stats(&ps->res_stats[i]); |
179 | |||
180 | perf_stat_evsel_id_init(evsel); | ||
183 | } | 181 | } |
184 | 182 | ||
185 | static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel) | 183 | static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel) |
diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index 6506b3dfb605..8e9f6bb7581b 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c | |||
@@ -1,6 +1,6 @@ | |||
1 | #include <math.h> | 1 | #include <math.h> |
2 | |||
3 | #include "stat.h" | 2 | #include "stat.h" |
3 | #include "evsel.h" | ||
4 | 4 | ||
5 | void update_stats(struct stats *stats, u64 val) | 5 | void update_stats(struct stats *stats, u64 val) |
6 | { | 6 | { |
@@ -61,3 +61,32 @@ double rel_stddev_stats(double stddev, double avg) | |||
61 | 61 | ||
62 | return pct; | 62 | return pct; |
63 | } | 63 | } |
64 | |||
65 | bool __perf_evsel_stat__is(struct perf_evsel *evsel, | ||
66 | enum perf_stat_evsel_id id) | ||
67 | { | ||
68 | struct perf_stat *ps = evsel->priv; | ||
69 | |||
70 | return ps->id == id; | ||
71 | } | ||
72 | |||
73 | #define ID(id, name) [PERF_STAT_EVSEL_ID__##id] = #name | ||
74 | static const char *id_str[PERF_STAT_EVSEL_ID__MAX] = { | ||
75 | ID(NONE, x), | ||
76 | }; | ||
77 | #undef ID | ||
78 | |||
79 | void perf_stat_evsel_id_init(struct perf_evsel *evsel) | ||
80 | { | ||
81 | struct perf_stat *ps = evsel->priv; | ||
82 | int i; | ||
83 | |||
84 | /* ps->id is 0 hence PERF_STAT_EVSEL_ID__NONE by default */ | ||
85 | |||
86 | for (i = 0; i < PERF_STAT_EVSEL_ID__MAX; i++) { | ||
87 | if (!strcmp(perf_evsel__name(evsel), id_str[i])) { | ||
88 | ps->id = i; | ||
89 | break; | ||
90 | } | ||
91 | } | ||
92 | } | ||
diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h index 5667fc3e39cf..f4136cfd3cc9 100644 --- a/tools/perf/util/stat.h +++ b/tools/perf/util/stat.h | |||
@@ -9,6 +9,16 @@ struct stats | |||
9 | u64 max, min; | 9 | u64 max, min; |
10 | }; | 10 | }; |
11 | 11 | ||
12 | enum perf_stat_evsel_id { | ||
13 | PERF_STAT_EVSEL_ID__NONE = 0, | ||
14 | PERF_STAT_EVSEL_ID__MAX, | ||
15 | }; | ||
16 | |||
17 | struct perf_stat { | ||
18 | struct stats res_stats[3]; | ||
19 | enum perf_stat_evsel_id id; | ||
20 | }; | ||
21 | |||
12 | void update_stats(struct stats *stats, u64 val); | 22 | void update_stats(struct stats *stats, u64 val); |
13 | double avg_stats(struct stats *stats); | 23 | double avg_stats(struct stats *stats); |
14 | double stddev_stats(struct stats *stats); | 24 | double stddev_stats(struct stats *stats); |
@@ -22,4 +32,14 @@ static inline void init_stats(struct stats *stats) | |||
22 | stats->min = (u64) -1; | 32 | stats->min = (u64) -1; |
23 | stats->max = 0; | 33 | stats->max = 0; |
24 | } | 34 | } |
35 | |||
36 | struct perf_evsel; | ||
37 | bool __perf_evsel_stat__is(struct perf_evsel *evsel, | ||
38 | enum perf_stat_evsel_id id); | ||
39 | |||
40 | #define perf_stat_evsel__is(evsel, id) \ | ||
41 | __perf_evsel_stat__is(evsel, PERF_STAT_EVSEL_ID__ ## id) | ||
42 | |||
43 | void perf_stat_evsel_id_init(struct perf_evsel *evsel); | ||
44 | |||
25 | #endif | 45 | #endif |