mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-06 14:45:14 +00:00
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>
This commit is contained in:
parent
a3d86542de
commit
e2f56da1d6
3 changed files with 52 additions and 5 deletions
|
@ -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)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue