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

perf stat: Replace transaction event possition check with id check

Using perf_stat::id to check for transaction events, instead of current
position based way.
Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
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/1433341559-31848-3-git-send-email-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent e2f56da1
...@@ -96,17 +96,6 @@ static const char * const transaction_limited_attrs[] = { ...@@ -96,17 +96,6 @@ static const char * const transaction_limited_attrs[] = {
"}" "}"
}; };
/* must match transaction_attrs and the beginning limited_attrs */
enum {
T_TASK_CLOCK,
T_INSTRUCTIONS,
T_CYCLES,
T_CYCLES_IN_TX,
T_TRANSACTION_START,
T_ELISION_START,
T_CYCLES_IN_TX_CP,
};
static struct perf_evlist *evsel_list; static struct perf_evlist *evsel_list;
static struct target target = { static struct target target = {
...@@ -352,29 +341,6 @@ static inline int nsec_counter(struct perf_evsel *evsel) ...@@ -352,29 +341,6 @@ static inline int nsec_counter(struct perf_evsel *evsel)
return 0; return 0;
} }
static struct perf_evsel *nth_evsel(int n)
{
static struct perf_evsel **array;
static int array_len;
struct perf_evsel *ev;
int j;
/* Assumes this only called when evsel_list does not change anymore. */
if (!array) {
evlist__for_each(evsel_list, ev)
array_len++;
array = malloc(array_len * sizeof(void *));
if (!array)
exit(ENOMEM);
j = 0;
evlist__for_each(evsel_list, ev)
array[j++] = ev;
}
if (n < array_len)
return array[n];
return NULL;
}
/* /*
* Update various tracking values we maintain to print * Update various tracking values we maintain to print
* more semantic information such as miss/hit ratios, * more semantic information such as miss/hit ratios,
...@@ -389,14 +355,11 @@ static void update_shadow_stats(struct perf_evsel *counter, u64 *count, ...@@ -389,14 +355,11 @@ static void update_shadow_stats(struct perf_evsel *counter, u64 *count,
update_stats(&runtime_nsecs_stats[cpu], count[0]); update_stats(&runtime_nsecs_stats[cpu], count[0]);
else if (perf_evsel__match(counter, HARDWARE, HW_CPU_CYCLES)) else if (perf_evsel__match(counter, HARDWARE, HW_CPU_CYCLES))
update_stats(&runtime_cycles_stats[ctx][cpu], count[0]); update_stats(&runtime_cycles_stats[ctx][cpu], count[0]);
else if (transaction_run && else if (transaction_run && perf_stat_evsel__is(counter, CYCLES_IN_TX))
perf_evsel__cmp(counter, nth_evsel(T_CYCLES_IN_TX)))
update_stats(&runtime_transaction_stats[ctx][cpu], count[0]); update_stats(&runtime_transaction_stats[ctx][cpu], count[0]);
else if (transaction_run && else if (transaction_run && perf_stat_evsel__is(counter, TRANSACTION_START))
perf_evsel__cmp(counter, nth_evsel(T_TRANSACTION_START)))
update_stats(&runtime_transaction_stats[ctx][cpu], count[0]); update_stats(&runtime_transaction_stats[ctx][cpu], count[0]);
else if (transaction_run && else if (transaction_run && perf_stat_evsel__is(counter, ELISION_START))
perf_evsel__cmp(counter, nth_evsel(T_ELISION_START)))
update_stats(&runtime_elision_stats[ctx][cpu], count[0]); update_stats(&runtime_elision_stats[ctx][cpu], count[0]);
else if (perf_evsel__match(counter, HARDWARE, HW_STALLED_CYCLES_FRONTEND)) else if (perf_evsel__match(counter, HARDWARE, HW_STALLED_CYCLES_FRONTEND))
update_stats(&runtime_stalled_cycles_front_stats[ctx][cpu], count[0]); update_stats(&runtime_stalled_cycles_front_stats[ctx][cpu], count[0]);
...@@ -1207,15 +1170,13 @@ static void abs_printout(int id, int nr, struct perf_evsel *evsel, double avg) ...@@ -1207,15 +1170,13 @@ static void abs_printout(int id, int nr, struct perf_evsel *evsel, double avg)
} else { } else {
fprintf(output, " "); fprintf(output, " ");
} }
} else if (transaction_run && } else if (transaction_run && perf_stat_evsel__is(evsel, CYCLES_IN_TX)) {
perf_evsel__cmp(evsel, nth_evsel(T_CYCLES_IN_TX))) {
total = avg_stats(&runtime_cycles_stats[ctx][cpu]); total = avg_stats(&runtime_cycles_stats[ctx][cpu]);
if (total) if (total)
fprintf(output, fprintf(output,
" # %5.2f%% transactional cycles ", " # %5.2f%% transactional cycles ",
100.0 * (avg / total)); 100.0 * (avg / total));
} else if (transaction_run && } else if (transaction_run && perf_stat_evsel__is(evsel, CYCLES_IN_TX_CP)) {
perf_evsel__cmp(evsel, nth_evsel(T_CYCLES_IN_TX_CP))) {
total = avg_stats(&runtime_cycles_stats[ctx][cpu]); total = avg_stats(&runtime_cycles_stats[ctx][cpu]);
total2 = avg_stats(&runtime_cycles_in_tx_stats[ctx][cpu]); total2 = avg_stats(&runtime_cycles_in_tx_stats[ctx][cpu]);
if (total2 < avg) if (total2 < avg)
...@@ -1224,8 +1185,7 @@ static void abs_printout(int id, int nr, struct perf_evsel *evsel, double avg) ...@@ -1224,8 +1185,7 @@ static void abs_printout(int id, int nr, struct perf_evsel *evsel, double avg)
fprintf(output, fprintf(output,
" # %5.2f%% aborted cycles ", " # %5.2f%% aborted cycles ",
100.0 * ((total2-avg) / total)); 100.0 * ((total2-avg) / total));
} else if (transaction_run && } else if (transaction_run && perf_stat_evsel__is(evsel, TRANSACTION_START) &&
perf_evsel__cmp(evsel, nth_evsel(T_TRANSACTION_START)) &&
avg > 0 && avg > 0 &&
runtime_cycles_in_tx_stats[ctx][cpu].n != 0) { runtime_cycles_in_tx_stats[ctx][cpu].n != 0) {
total = avg_stats(&runtime_cycles_in_tx_stats[ctx][cpu]); total = avg_stats(&runtime_cycles_in_tx_stats[ctx][cpu]);
...@@ -1234,8 +1194,7 @@ static void abs_printout(int id, int nr, struct perf_evsel *evsel, double avg) ...@@ -1234,8 +1194,7 @@ static void abs_printout(int id, int nr, struct perf_evsel *evsel, double avg)
ratio = total / avg; ratio = total / avg;
fprintf(output, " # %8.0f cycles / transaction ", ratio); fprintf(output, " # %8.0f cycles / transaction ", ratio);
} else if (transaction_run && } else if (transaction_run && perf_stat_evsel__is(evsel, ELISION_START) &&
perf_evsel__cmp(evsel, nth_evsel(T_ELISION_START)) &&
avg > 0 && avg > 0 &&
runtime_cycles_in_tx_stats[ctx][cpu].n != 0) { runtime_cycles_in_tx_stats[ctx][cpu].n != 0) {
total = avg_stats(&runtime_cycles_in_tx_stats[ctx][cpu]); total = avg_stats(&runtime_cycles_in_tx_stats[ctx][cpu]);
......
...@@ -72,7 +72,11 @@ bool __perf_evsel_stat__is(struct perf_evsel *evsel, ...@@ -72,7 +72,11 @@ bool __perf_evsel_stat__is(struct perf_evsel *evsel,
#define ID(id, name) [PERF_STAT_EVSEL_ID__##id] = #name #define ID(id, name) [PERF_STAT_EVSEL_ID__##id] = #name
static const char *id_str[PERF_STAT_EVSEL_ID__MAX] = { static const char *id_str[PERF_STAT_EVSEL_ID__MAX] = {
ID(NONE, x), ID(NONE, x),
ID(CYCLES_IN_TX, cpu/cycles-t/),
ID(TRANSACTION_START, cpu/tx-start/),
ID(ELISION_START, cpu/el-start/),
ID(CYCLES_IN_TX_CP, cpu/cycles-ct/),
}; };
#undef ID #undef ID
......
...@@ -11,6 +11,10 @@ struct stats ...@@ -11,6 +11,10 @@ struct stats
enum perf_stat_evsel_id { enum perf_stat_evsel_id {
PERF_STAT_EVSEL_ID__NONE = 0, PERF_STAT_EVSEL_ID__NONE = 0,
PERF_STAT_EVSEL_ID__CYCLES_IN_TX,
PERF_STAT_EVSEL_ID__TRANSACTION_START,
PERF_STAT_EVSEL_ID__ELISION_START,
PERF_STAT_EVSEL_ID__CYCLES_IN_TX_CP,
PERF_STAT_EVSEL_ID__MAX, PERF_STAT_EVSEL_ID__MAX,
}; };
......
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