[PATCH 12/31] perf, tools: Support sorting by intx, abort branch flags

2012-10-02 Thread Andi Kleen
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

2012-10-02 Thread Andi Kleen
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,