Skip to content

Commit

Permalink
perf stat: Add id into perf_stat struct
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jiri Olsa authored and Arnaldo Carvalho de Melo committed Jun 8, 2015
1 parent a3d8654 commit e2f56da
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 5 deletions.
6 changes: 2 additions & 4 deletions tools/perf/builtin-stat.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,10 +147,6 @@ static int (*aggr_get_id)(struct cpu_map *m, int cpu);

static volatile int done = 0;

struct perf_stat {
struct stats res_stats[3];
};

static inline void diff_timespec(struct timespec *r, struct timespec *a,
struct timespec *b)
{
Expand Down Expand Up @@ -180,6 +176,8 @@ static void perf_evsel__reset_stat_priv(struct perf_evsel *evsel)

for (i = 0; i < 3; i++)
init_stats(&ps->res_stats[i]);

perf_stat_evsel_id_init(evsel);
}

static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel)
Expand Down
31 changes: 30 additions & 1 deletion tools/perf/util/stat.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <math.h>

#include "stat.h"
#include "evsel.h"

void update_stats(struct stats *stats, u64 val)
{
Expand Down Expand Up @@ -61,3 +61,32 @@ double rel_stddev_stats(double stddev, double avg)

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;
}
}
}
20 changes: 20 additions & 0 deletions tools/perf/util/stat.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,16 @@ struct stats
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);
double avg_stats(struct stats *stats);
double stddev_stats(struct stats *stats);
Expand All @@ -22,4 +32,14 @@ static inline void init_stats(struct stats *stats)
stats->min = (u64) -1;
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

0 comments on commit e2f56da

Please sign in to comment.