perf c2c: Add dimensions for 'N/A' metrics of store operation
[linux-2.6-microblaze.git] / tools / perf / builtin-c2c.c
index fbbed43..c8230c4 100644 (file)
@@ -653,6 +653,7 @@ STAT_FN(lcl_hitm)
 STAT_FN(store)
 STAT_FN(st_l1hit)
 STAT_FN(st_l1miss)
+STAT_FN(st_na)
 STAT_FN(ld_fbhit)
 STAT_FN(ld_l1hit)
 STAT_FN(ld_l2hit)
@@ -677,7 +678,8 @@ static uint64_t total_records(struct c2c_stats *stats)
 
        total    = ldcnt +
                   stats->st_l1hit +
-                  stats->st_l1miss;
+                  stats->st_l1miss +
+                  stats->st_na;
 
        return total;
 }
@@ -899,6 +901,7 @@ PERCENT_FN(rmt_hitm)
 PERCENT_FN(lcl_hitm)
 PERCENT_FN(st_l1hit)
 PERCENT_FN(st_l1miss)
+PERCENT_FN(st_na)
 
 static int
 percent_rmt_hitm_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
@@ -1024,6 +1027,37 @@ percent_stores_l1miss_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
        return per_left - per_right;
 }
 
+static int
+percent_stores_na_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_na);
+       char buf[10];
+
+       return scnprintf(hpp->buf, hpp->size, "%*s", width, PERC_STR(buf, per));
+}
+
+static int
+percent_stores_na_color(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+                       struct hist_entry *he)
+{
+       return percent_color(fmt, hpp, he, percent_st_na);
+}
+
+static int64_t
+percent_stores_na_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_na);
+       per_right = PERCENT(right, st_na);
+
+       return per_left - per_right;
+}
+
 STAT_FN(lcl_dram)
 STAT_FN(rmt_dram)
 
@@ -1351,7 +1385,7 @@ static struct c2c_dimension dim_tot_stores = {
 };
 
 static struct c2c_dimension dim_stores_l1hit = {
-       .header         = HEADER_SPAN("---- Stores ----", "L1Hit", 1),
+       .header         = HEADER_SPAN("--------- Stores --------", "L1Hit", 2),
        .name           = "stores_l1hit",
        .cmp            = st_l1hit_cmp,
        .entry          = st_l1hit_entry,
@@ -1366,8 +1400,16 @@ static struct c2c_dimension dim_stores_l1miss = {
        .width          = 7,
 };
 
+static struct c2c_dimension dim_stores_na = {
+       .header         = HEADER_SPAN_LOW("N/A"),
+       .name           = "stores_na",
+       .cmp            = st_na_cmp,
+       .entry          = st_na_entry,
+       .width          = 7,
+};
+
 static struct c2c_dimension dim_cl_stores_l1hit = {
-       .header         = HEADER_SPAN("-- Store Refs --", "L1 Hit", 1),
+       .header         = HEADER_SPAN("------- Store Refs ------", "L1 Hit", 2),
        .name           = "cl_stores_l1hit",
        .cmp            = st_l1hit_cmp,
        .entry          = st_l1hit_entry,
@@ -1382,6 +1424,14 @@ static struct c2c_dimension dim_cl_stores_l1miss = {
        .width          = 7,
 };
 
+static struct c2c_dimension dim_cl_stores_na = {
+       .header         = HEADER_SPAN_LOW("N/A"),
+       .name           = "cl_stores_na",
+       .cmp            = st_na_cmp,
+       .entry          = st_na_entry,
+       .width          = 7,
+};
+
 static struct c2c_dimension dim_ld_fbhit = {
        .header         = HEADER_SPAN("----- Core Load Hit -----", "FB", 2),
        .name           = "ld_fbhit",
@@ -1471,7 +1521,7 @@ static struct c2c_dimension dim_percent_lcl_hitm = {
 };
 
 static struct c2c_dimension dim_percent_stores_l1hit = {
-       .header         = HEADER_SPAN("-- Store Refs --", "L1 Hit", 1),
+       .header         = HEADER_SPAN("------- Store Refs ------", "L1 Hit", 2),
        .name           = "percent_stores_l1hit",
        .cmp            = percent_stores_l1hit_cmp,
        .entry          = percent_stores_l1hit_entry,
@@ -1488,6 +1538,15 @@ static struct c2c_dimension dim_percent_stores_l1miss = {
        .width          = 7,
 };
 
+static struct c2c_dimension dim_percent_stores_na = {
+       .header         = HEADER_SPAN_LOW("N/A"),
+       .name           = "percent_stores_na",
+       .cmp            = percent_stores_na_cmp,
+       .entry          = percent_stores_na_entry,
+       .color          = percent_stores_na_color,
+       .width          = 7,
+};
+
 static struct c2c_dimension dim_dram_lcl = {
        .header         = HEADER_SPAN("--- Load Dram ----", "Lcl", 1),
        .name           = "dram_lcl",
@@ -1618,8 +1677,10 @@ static struct c2c_dimension *dimensions[] = {
        &dim_tot_stores,
        &dim_stores_l1hit,
        &dim_stores_l1miss,
+       &dim_stores_na,
        &dim_cl_stores_l1hit,
        &dim_cl_stores_l1miss,
+       &dim_cl_stores_na,
        &dim_ld_fbhit,
        &dim_ld_l1hit,
        &dim_ld_l2hit,
@@ -1632,6 +1693,7 @@ static struct c2c_dimension *dimensions[] = {
        &dim_percent_lcl_hitm,
        &dim_percent_stores_l1hit,
        &dim_percent_stores_l1miss,
+       &dim_percent_stores_na,
        &dim_dram_lcl,
        &dim_dram_rmt,
        &dim_pid,
@@ -2149,6 +2211,7 @@ static void print_c2c__display_stats(FILE *out)
        fprintf(out, "  Store - no mapping                : %10d\n", stats->st_noadrs);
        fprintf(out, "  Store L1D Hit                     : %10d\n", stats->st_l1hit);
        fprintf(out, "  Store L1D Miss                    : %10d\n", stats->st_l1miss);
+       fprintf(out, "  Store No available memory level   : %10d\n", stats->st_na);
        fprintf(out, "  No Page Map Rejects               : %10d\n", stats->nomap);
        fprintf(out, "  Unable to parse data source       : %10d\n", stats->noparse);
 }
@@ -2171,6 +2234,7 @@ static void print_shared_cacheline_info(FILE *out)
        fprintf(out, "  Blocked Access on shared lines    : %10d\n", stats->blk_data + stats->blk_addr);
        fprintf(out, "  Store HITs on shared lines        : %10d\n", stats->store);
        fprintf(out, "  Store L1D hits on shared lines    : %10d\n", stats->st_l1hit);
+       fprintf(out, "  Store No available memory level   : %10d\n", stats->st_na);
        fprintf(out, "  Total Merged records              : %10d\n", hitm_cnt + stats->store);
 }
 
@@ -2193,10 +2257,10 @@ static void print_cacheline(struct c2c_hists *c2c_hists,
                fprintf(out, "\n");
        }
 
-       fprintf(out, "  -------------------------------------------------------------\n");
+       fprintf(out, "  ----------------------------------------------------------------------\n");
        __hist_entry__snprintf(he_cl, &hpp, hpp_list);
        fprintf(out, "%s\n", bf);
-       fprintf(out, "  -------------------------------------------------------------\n");
+       fprintf(out, "  ----------------------------------------------------------------------\n");
 
        hists__fprintf(&c2c_hists->hists, false, 0, 0, 0, out, false);
 }
@@ -2213,6 +2277,7 @@ static void print_pareto(FILE *out)
                    "cl_lcl_hitm,"
                    "cl_stores_l1hit,"
                    "cl_stores_l1miss,"
+                   "cl_stores_na,"
                    "dcacheline";
 
        perf_hpp_list__init(&hpp_list);
@@ -2664,6 +2729,7 @@ static int build_cl_output(char *cl_sort, bool no_source)
                "percent_lcl_hitm,"
                "percent_stores_l1hit,"
                "percent_stores_l1miss,"
+               "percent_stores_na,"
                "offset,offset_node,dcacheline_count,",
                add_pid   ? "pid," : "",
                add_tid   ? "tid," : "",
@@ -2850,7 +2916,7 @@ static int perf_c2c__report(int argc, const char **argv)
                     "tot_recs,"
                     "tot_loads,"
                     "tot_stores,"
-                    "stores_l1hit,stores_l1miss,"
+                    "stores_l1hit,stores_l1miss,stores_na,"
                     "ld_fbhit,ld_l1hit,ld_l2hit,"
                     "ld_lclhit,lcl_hitm,"
                     "ld_rmthit,rmt_hitm,"