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

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.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent a3d86542
Loading
Loading
Loading
Loading
+2 −4
Original line number Original line Diff line number Diff line
@@ -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)


	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)
+30 −1
Original line number Original line Diff line number Diff line
#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)


	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;
		}
	}
}
+20 −0
Original line number Original line Diff line number Diff line
@@ -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)
	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