aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@redhat.com>2015-06-04 09:50:55 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-06-08 09:30:30 -0400
commite2f56da1d6670070f6f55d43007cb7b03ee04c2f (patch)
tree370c939f0fbba94fe15ace10d7dd515a1b0b3ce7
parenta3d86542de8850be52e8589da22b24002941dfb7 (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.c6
-rw-r--r--tools/perf/util/stat.c31
-rw-r--r--tools/perf/util/stat.h20
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
148static volatile int done = 0; 148static volatile int done = 0;
149 149
150struct perf_stat {
151 struct stats res_stats[3];
152};
153
154static inline void diff_timespec(struct timespec *r, struct timespec *a, 150static 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
185static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel) 183static 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
5void update_stats(struct stats *stats, u64 val) 5void 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
65bool __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
74static const char *id_str[PERF_STAT_EVSEL_ID__MAX] = {
75 ID(NONE, x),
76};
77#undef ID
78
79void 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
12enum perf_stat_evsel_id {
13 PERF_STAT_EVSEL_ID__NONE = 0,
14 PERF_STAT_EVSEL_ID__MAX,
15};
16
17struct perf_stat {
18 struct stats res_stats[3];
19 enum perf_stat_evsel_id id;
20};
21
12void update_stats(struct stats *stats, u64 val); 22void update_stats(struct stats *stats, u64 val);
13double avg_stats(struct stats *stats); 23double avg_stats(struct stats *stats);
14double stddev_stats(struct stats *stats); 24double 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
36struct perf_evsel;
37bool __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
43void perf_stat_evsel_id_init(struct perf_evsel *evsel);
44
25#endif 45#endif