[PATCH 31/57] perf c2c report: Add hitm/store percent related sort keys

2016-09-22 Thread Jiri Olsa
Adding hitm/store percent dimension key wrappers.

They are to be displayed in the single cacheline output:

  percent_rmt_hitm, percent_lcl_hitm, percent_stores_l1hit, 
percent_stores_l1miss

They display percentage of HITMs/stores for specific
offset in the cacheline.

Link: http://lkml.kernel.org/n/tip-t365aosxtdut8sgrgn8mf...@git.kernel.org
Signed-off-by: Jiri Olsa 
---
 tools/perf/builtin-c2c.c | 206 +++
 1 file changed, 206 insertions(+)

diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c
index e24472f100c6..b2992cf96130 100644
--- a/tools/perf/builtin-c2c.c
+++ b/tools/perf/builtin-c2c.c
@@ -639,6 +639,171 @@ percent_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
return per_left - per_right;
 }
 
+static struct c2c_stats *he_stats(struct hist_entry *he)
+{
+   struct c2c_hist_entry *c2c_he;
+
+   c2c_he = container_of(he, struct c2c_hist_entry, he);
+   return _he->stats;
+}
+
+static struct c2c_stats *total_stats(struct hist_entry *he)
+{
+   struct c2c_hists *hists;
+
+   hists = container_of(he->hists, struct c2c_hists, hists);
+   return >stats;
+}
+
+static double percent(int st, int tot)
+{
+   return tot ? 100. * (double) st / (double) tot : 0;
+}
+
+#define PERCENT(__h, __f) percent(he_stats(__h)->__f, total_stats(__h)->__f)
+
+#define PERCENT_FN(__f)
\
+static double percent_ ## __f(struct c2c_hist_entry *c2c_he)   
\
+{  
\
+   struct c2c_hists *hists;
\
+   
\
+   hists = container_of(c2c_he->he.hists, struct c2c_hists, hists);
\
+   return percent(c2c_he->stats.__f, hists->stats.__f);
\
+}
+
+PERCENT_FN(rmt_hitm)
+PERCENT_FN(lcl_hitm)
+PERCENT_FN(st_l1hit)
+PERCENT_FN(st_l1miss)
+
+static int
+percent_rmt_hitm_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   int width = c2c_width(fmt, hpp, he->hists);
+   double per = PERCENT(he, rmt_hitm);
+   char buf[10];
+
+   snprintf(buf, 10, "%.2F%%", per);
+   return snprintf(hpp->buf, hpp->size, "%*s", width, buf);
+}
+
+static int
+percent_rmt_hitm_color(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   return percent_color(fmt, hpp, he, percent_rmt_hitm);
+}
+
+static int64_t
+percent_rmt_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
+struct hist_entry *left, struct hist_entry *right)
+{
+   double per_left;
+   double per_right;
+
+   per_left  = PERCENT(left, lcl_hitm);
+   per_right = PERCENT(right, lcl_hitm);
+
+   return per_left - per_right;
+}
+
+static int
+percent_lcl_hitm_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   int width = c2c_width(fmt, hpp, he->hists);
+   double per = PERCENT(he, lcl_hitm);
+   char buf[10];
+
+   snprintf(buf, 10, "%.2F%%", per);
+   return snprintf(hpp->buf, hpp->size, "%*s", width, buf);
+}
+
+static int
+percent_lcl_hitm_color(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   return percent_color(fmt, hpp, he, percent_lcl_hitm);
+}
+
+static int64_t
+percent_lcl_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
+struct hist_entry *left, struct hist_entry *right)
+{
+   double per_left;
+   double per_right;
+
+   per_left  = PERCENT(left, lcl_hitm);
+   per_right = PERCENT(right, lcl_hitm);
+
+   return per_left - per_right;
+}
+
+static int
+percent_stores_l1hit_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   int width = c2c_width(fmt, hpp, he->hists);
+   double per = PERCENT(he, st_l1hit);
+   char buf[10];
+
+   snprintf(buf, 10, "%.2F%%", per);
+   return snprintf(hpp->buf, hpp->size, "%*s", width, buf);
+}
+
+static int
+percent_stores_l1hit_color(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   return percent_color(fmt, hpp, he, percent_st_l1hit);
+}
+
+static int64_t
+percent_stores_l1hit_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
+   struct hist_entry *left, struct hist_entry *right)
+{
+   double per_left;
+   double per_right;
+
+   per_left  = PERCENT(left, st_l1hit);
+   per_right = PERCENT(right, st_l1hit);
+
+   return per_left - per_right;
+}
+
+static int
+percent_stores_l1miss_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   int width = c2c_width(fmt, hpp, 

[PATCH 31/57] perf c2c report: Add hitm/store percent related sort keys

2016-09-22 Thread Jiri Olsa
Adding hitm/store percent dimension key wrappers.

They are to be displayed in the single cacheline output:

  percent_rmt_hitm, percent_lcl_hitm, percent_stores_l1hit, 
percent_stores_l1miss

They display percentage of HITMs/stores for specific
offset in the cacheline.

Link: http://lkml.kernel.org/n/tip-t365aosxtdut8sgrgn8mf...@git.kernel.org
Signed-off-by: Jiri Olsa 
---
 tools/perf/builtin-c2c.c | 206 +++
 1 file changed, 206 insertions(+)

diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c
index e24472f100c6..b2992cf96130 100644
--- a/tools/perf/builtin-c2c.c
+++ b/tools/perf/builtin-c2c.c
@@ -639,6 +639,171 @@ percent_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
return per_left - per_right;
 }
 
+static struct c2c_stats *he_stats(struct hist_entry *he)
+{
+   struct c2c_hist_entry *c2c_he;
+
+   c2c_he = container_of(he, struct c2c_hist_entry, he);
+   return _he->stats;
+}
+
+static struct c2c_stats *total_stats(struct hist_entry *he)
+{
+   struct c2c_hists *hists;
+
+   hists = container_of(he->hists, struct c2c_hists, hists);
+   return >stats;
+}
+
+static double percent(int st, int tot)
+{
+   return tot ? 100. * (double) st / (double) tot : 0;
+}
+
+#define PERCENT(__h, __f) percent(he_stats(__h)->__f, total_stats(__h)->__f)
+
+#define PERCENT_FN(__f)
\
+static double percent_ ## __f(struct c2c_hist_entry *c2c_he)   
\
+{  
\
+   struct c2c_hists *hists;
\
+   
\
+   hists = container_of(c2c_he->he.hists, struct c2c_hists, hists);
\
+   return percent(c2c_he->stats.__f, hists->stats.__f);
\
+}
+
+PERCENT_FN(rmt_hitm)
+PERCENT_FN(lcl_hitm)
+PERCENT_FN(st_l1hit)
+PERCENT_FN(st_l1miss)
+
+static int
+percent_rmt_hitm_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   int width = c2c_width(fmt, hpp, he->hists);
+   double per = PERCENT(he, rmt_hitm);
+   char buf[10];
+
+   snprintf(buf, 10, "%.2F%%", per);
+   return snprintf(hpp->buf, hpp->size, "%*s", width, buf);
+}
+
+static int
+percent_rmt_hitm_color(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   return percent_color(fmt, hpp, he, percent_rmt_hitm);
+}
+
+static int64_t
+percent_rmt_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
+struct hist_entry *left, struct hist_entry *right)
+{
+   double per_left;
+   double per_right;
+
+   per_left  = PERCENT(left, lcl_hitm);
+   per_right = PERCENT(right, lcl_hitm);
+
+   return per_left - per_right;
+}
+
+static int
+percent_lcl_hitm_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   int width = c2c_width(fmt, hpp, he->hists);
+   double per = PERCENT(he, lcl_hitm);
+   char buf[10];
+
+   snprintf(buf, 10, "%.2F%%", per);
+   return snprintf(hpp->buf, hpp->size, "%*s", width, buf);
+}
+
+static int
+percent_lcl_hitm_color(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   return percent_color(fmt, hpp, he, percent_lcl_hitm);
+}
+
+static int64_t
+percent_lcl_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
+struct hist_entry *left, struct hist_entry *right)
+{
+   double per_left;
+   double per_right;
+
+   per_left  = PERCENT(left, lcl_hitm);
+   per_right = PERCENT(right, lcl_hitm);
+
+   return per_left - per_right;
+}
+
+static int
+percent_stores_l1hit_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   int width = c2c_width(fmt, hpp, he->hists);
+   double per = PERCENT(he, st_l1hit);
+   char buf[10];
+
+   snprintf(buf, 10, "%.2F%%", per);
+   return snprintf(hpp->buf, hpp->size, "%*s", width, buf);
+}
+
+static int
+percent_stores_l1hit_color(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   return percent_color(fmt, hpp, he, percent_st_l1hit);
+}
+
+static int64_t
+percent_stores_l1hit_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
+   struct hist_entry *left, struct hist_entry *right)
+{
+   double per_left;
+   double per_right;
+
+   per_left  = PERCENT(left, st_l1hit);
+   per_right = PERCENT(right, st_l1hit);
+
+   return per_left - per_right;
+}
+
+static int
+percent_stores_l1miss_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+  struct hist_entry *he)
+{
+   int width = c2c_width(fmt, hpp, he->hists);
+   double