Commit e2f56da1 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

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: default avatarJiri Olsa <jolsa@kernel.org>
Tested-by: default avatarArnaldo 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.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent a3d86542
...@@ -147,10 +147,6 @@ static int (*aggr_get_id)(struct cpu_map *m, int cpu); ...@@ -147,10 +147,6 @@ static int (*aggr_get_id)(struct cpu_map *m, int cpu);
static volatile int done = 0; static volatile int done = 0;
struct perf_stat {
struct stats res_stats[3];
};
static inline void diff_timespec(struct timespec *r, struct timespec *a, static inline void diff_timespec(struct timespec *r, struct timespec *a,
struct timespec *b) struct timespec *b)
{ {
...@@ -180,6 +176,8 @@ static void perf_evsel__reset_stat_priv(struct perf_evsel *evsel) ...@@ -180,6 +176,8 @@ static void perf_evsel__reset_stat_priv(struct perf_evsel *evsel)
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
init_stats(&ps->res_stats[i]); init_stats(&ps->res_stats[i]);
perf_stat_evsel_id_init(evsel);
} }
static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel) static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel)
......
#include <math.h> #include <math.h>
#include "stat.h" #include "stat.h"
#include "evsel.h"
void update_stats(struct stats *stats, u64 val) void update_stats(struct stats *stats, u64 val)
{ {
...@@ -61,3 +61,32 @@ double rel_stddev_stats(double stddev, double avg) ...@@ -61,3 +61,32 @@ double rel_stddev_stats(double stddev, double avg)
return pct; return pct;
} }
bool __perf_evsel_stat__is(struct perf_evsel *evsel,
enum perf_stat_evsel_id id)
{
struct perf_stat *ps = evsel->priv;
return ps->id == id;
}
#define ID(id, name) [PERF_STAT_EVSEL_ID__##id] = #name
static const char *id_str[PERF_STAT_EVSEL_ID__MAX] = {
ID(NONE, x),
};
#undef ID
void perf_stat_evsel_id_init(struct perf_evsel *evsel)
{
struct perf_stat *ps = evsel->priv;
int i;
/* ps->id is 0 hence PERF_STAT_EVSEL_ID__NONE by default */
for (i = 0; i < PERF_STAT_EVSEL_ID__MAX; i++) {
if (!strcmp(perf_evsel__name(evsel), id_str[i])) {
ps->id = i;
break;
}
}
}
...@@ -9,6 +9,16 @@ struct stats ...@@ -9,6 +9,16 @@ struct stats
u64 max, min; u64 max, min;
}; };
enum perf_stat_evsel_id {
PERF_STAT_EVSEL_ID__NONE = 0,
PERF_STAT_EVSEL_ID__MAX,
};
struct perf_stat {
struct stats res_stats[3];
enum perf_stat_evsel_id id;
};
void update_stats(struct stats *stats, u64 val); void update_stats(struct stats *stats, u64 val);
double avg_stats(struct stats *stats); double avg_stats(struct stats *stats);
double stddev_stats(struct stats *stats); double stddev_stats(struct stats *stats);
...@@ -22,4 +32,14 @@ static inline void init_stats(struct stats *stats) ...@@ -22,4 +32,14 @@ static inline void init_stats(struct stats *stats)
stats->min = (u64) -1; stats->min = (u64) -1;
stats->max = 0; stats->max = 0;
} }
struct perf_evsel;
bool __perf_evsel_stat__is(struct perf_evsel *evsel,
enum perf_stat_evsel_id id);
#define perf_stat_evsel__is(evsel, id) \
__perf_evsel_stat__is(evsel, PERF_STAT_EVSEL_ID__ ## id)
void perf_stat_evsel_id_init(struct perf_evsel *evsel);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment