[PATCH 12/31] perf, tools: Support sorting by intx, abort branch flags
From: Andi Kleen Extend the perf branch sorting code to support sorting by intx or abort qualifiers. Also print out those qualifiers. Signed-off-by: Andi Kleen --- tools/perf/builtin-report.c |3 +- tools/perf/builtin-top.c|4 ++- tools/perf/perf.h |4 ++- tools/perf/util/hist.h |2 + tools/perf/util/sort.c | 55 +++ tools/perf/util/sort.h |2 + 6 files changed, 67 insertions(+), 3 deletions(-) diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 1da243d..d93094f 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -595,7 +595,8 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) "Use the stdio interface"), OPT_STRING('s', "sort", _order, "key[,key2...]", "sort by key(s): pid, comm, dso, symbol, parent, dso_to," - " dso_from, symbol_to, symbol_from, mispredict"), + " dso_from, symbol_to, symbol_from, mispredict, srcline," + " abort, intx"), OPT_BOOLEAN(0, "showcpuutilization", _conf.show_cpu_utilization, "Show sample percentage for different cpu modes"), OPT_STRING('p', "parent", _pattern, "regex", diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index e434a16..8853a24 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -1226,7 +1226,9 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused) OPT_INCR('v', "verbose", , "be more verbose (show counter open errors, etc)"), OPT_STRING('s', "sort", _order, "key[,key2...]", - "sort by key(s): pid, comm, dso, symbol, parent"), + "sort by key(s): pid, comm, dso, symbol, parent, dso_to," + " dso_from, symbol_to, symbol_from, mispredict, srcline," + " abort, intx"), OPT_BOOLEAN('n', "show-nr-samples", _conf.show_nr_samples, "Show a column with the number of samples"), OPT_CALLBACK_DEFAULT('G', "call-graph", , "output_type,min_percent, call_order", diff --git a/tools/perf/perf.h b/tools/perf/perf.h index a89cbbb..28ccb6b 100644 --- a/tools/perf/perf.h +++ b/tools/perf/perf.h @@ -194,7 +194,9 @@ struct ip_callchain { struct branch_flags { u64 mispred:1; u64 predicted:1; - u64 reserved:62; + u64 intx:1; + u64 abort:1; + u64 reserved:60; }; struct branch_entry { diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index f011ad4..12ff7b9 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h @@ -43,6 +43,8 @@ enum hist_column { HISTC_PARENT, HISTC_CPU, HISTC_MISPREDICT, + HISTC_INTX, + HISTC_ABORT, HISTC_SYMBOL_FROM, HISTC_SYMBOL_TO, HISTC_DSO_FROM, diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index b5b1b92..47fc0f2 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -470,6 +470,55 @@ struct sort_entry sort_mispredict = { .se_width_idx = HISTC_MISPREDICT, }; +static int64_t +sort__abort_cmp(struct hist_entry *left, struct hist_entry *right) +{ + return left->branch_info->flags.abort != + right->branch_info->flags.abort; +} + +static int hist_entry__abort_snprintf(struct hist_entry *self, char *bf, + size_t size, unsigned int width) +{ + static const char *out = "."; + + if (self->branch_info->flags.abort) + out = "A"; + return repsep_snprintf(bf, size, "%-*s", width, out); +} + +struct sort_entry sort_abort = { + .se_header = "Transaction abort", + .se_cmp = sort__abort_cmp, + .se_snprintf= hist_entry__abort_snprintf, + .se_width_idx = HISTC_ABORT, +}; + +static int64_t +sort__intx_cmp(struct hist_entry *left, struct hist_entry *right) +{ + return left->branch_info->flags.intx != + right->branch_info->flags.intx; +} + +static int hist_entry__intx_snprintf(struct hist_entry *self, char *bf, + size_t size, unsigned int width) +{ + static const char *out = "."; + + if (self->branch_info->flags.intx) + out = "T"; + + return repsep_snprintf(bf, size, "%-*s", width, out); +} + +struct sort_entry sort_intx = { + .se_header = "Branch in transaction", + .se_cmp = sort__intx_cmp, + .se_snprintf= hist_entry__intx_snprintf, + .se_width_idx = HISTC_INTX, +}; + struct sort_dimension { const char *name; struct sort_entry *entry; @@ -491,6 +540,8 @@ static struct sort_dimension sort_dimensions[] = { DIM(SORT_CPU, "cpu", sort_cpu), DIM(SORT_MISPREDICT, "mispredict", sort_mispredict), DIM(SORT_SRCLINE,
[PATCH 12/31] perf, tools: Support sorting by intx, abort branch flags
From: Andi Kleen a...@linux.intel.com Extend the perf branch sorting code to support sorting by intx or abort qualifiers. Also print out those qualifiers. Signed-off-by: Andi Kleen a...@linux.intel.com --- tools/perf/builtin-report.c |3 +- tools/perf/builtin-top.c|4 ++- tools/perf/perf.h |4 ++- tools/perf/util/hist.h |2 + tools/perf/util/sort.c | 55 +++ tools/perf/util/sort.h |2 + 6 files changed, 67 insertions(+), 3 deletions(-) diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 1da243d..d93094f 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -595,7 +595,8 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) Use the stdio interface), OPT_STRING('s', sort, sort_order, key[,key2...], sort by key(s): pid, comm, dso, symbol, parent, dso_to, - dso_from, symbol_to, symbol_from, mispredict), + dso_from, symbol_to, symbol_from, mispredict, srcline, + abort, intx), OPT_BOOLEAN(0, showcpuutilization, symbol_conf.show_cpu_utilization, Show sample percentage for different cpu modes), OPT_STRING('p', parent, parent_pattern, regex, diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index e434a16..8853a24 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -1226,7 +1226,9 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused) OPT_INCR('v', verbose, verbose, be more verbose (show counter open errors, etc)), OPT_STRING('s', sort, sort_order, key[,key2...], - sort by key(s): pid, comm, dso, symbol, parent), + sort by key(s): pid, comm, dso, symbol, parent, dso_to, + dso_from, symbol_to, symbol_from, mispredict, srcline, + abort, intx), OPT_BOOLEAN('n', show-nr-samples, symbol_conf.show_nr_samples, Show a column with the number of samples), OPT_CALLBACK_DEFAULT('G', call-graph, top, output_type,min_percent, call_order, diff --git a/tools/perf/perf.h b/tools/perf/perf.h index a89cbbb..28ccb6b 100644 --- a/tools/perf/perf.h +++ b/tools/perf/perf.h @@ -194,7 +194,9 @@ struct ip_callchain { struct branch_flags { u64 mispred:1; u64 predicted:1; - u64 reserved:62; + u64 intx:1; + u64 abort:1; + u64 reserved:60; }; struct branch_entry { diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index f011ad4..12ff7b9 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h @@ -43,6 +43,8 @@ enum hist_column { HISTC_PARENT, HISTC_CPU, HISTC_MISPREDICT, + HISTC_INTX, + HISTC_ABORT, HISTC_SYMBOL_FROM, HISTC_SYMBOL_TO, HISTC_DSO_FROM, diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index b5b1b92..47fc0f2 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -470,6 +470,55 @@ struct sort_entry sort_mispredict = { .se_width_idx = HISTC_MISPREDICT, }; +static int64_t +sort__abort_cmp(struct hist_entry *left, struct hist_entry *right) +{ + return left-branch_info-flags.abort != + right-branch_info-flags.abort; +} + +static int hist_entry__abort_snprintf(struct hist_entry *self, char *bf, + size_t size, unsigned int width) +{ + static const char *out = .; + + if (self-branch_info-flags.abort) + out = A; + return repsep_snprintf(bf, size, %-*s, width, out); +} + +struct sort_entry sort_abort = { + .se_header = Transaction abort, + .se_cmp = sort__abort_cmp, + .se_snprintf= hist_entry__abort_snprintf, + .se_width_idx = HISTC_ABORT, +}; + +static int64_t +sort__intx_cmp(struct hist_entry *left, struct hist_entry *right) +{ + return left-branch_info-flags.intx != + right-branch_info-flags.intx; +} + +static int hist_entry__intx_snprintf(struct hist_entry *self, char *bf, + size_t size, unsigned int width) +{ + static const char *out = .; + + if (self-branch_info-flags.intx) + out = T; + + return repsep_snprintf(bf, size, %-*s, width, out); +} + +struct sort_entry sort_intx = { + .se_header = Branch in transaction, + .se_cmp = sort__intx_cmp, + .se_snprintf= hist_entry__intx_snprintf, + .se_width_idx = HISTC_INTX, +}; + struct sort_dimension { const char *name; struct sort_entry *entry; @@ -491,6 +540,8 @@ static struct sort_dimension sort_dimensions[] = { DIM(SORT_CPU, cpu, sort_cpu), DIM(SORT_MISPREDICT, mispredict, sort_mispredict), DIM(SORT_SRCLINE, srcline,