perf c2c: Add metrics "RMT Load Hit"
authorLeo Yan <leo.yan@linaro.org>
Wed, 14 Oct 2020 05:09:21 +0000 (06:09 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 15 Oct 2020 12:34:51 +0000 (09:34 -0300)
The metrics "LLC Ld Miss" and "Load Dram" overlap with each other for
accouting items:

  "LLC Ld Miss" = "lcl_dram" + "rmt_dram" + "rmt_hit" + "rmt_hitm"
  "Load Dram"   = "lcl_dram" + "rmt_dram"

Furthermore, the metrics "LLC Ld Miss" is not directive to show
statistics due to it contains summary value and cannot give out
breakdown details.

For this reason, add a new metrics "RMT Load Hit" which is used to
present the remote cache hit; it contains two items:

  "RMT Load Hit" = remote hit ("rmt_hit") + remote hitm ("rmt_hitm")

As result, the metrics "LLC Ld Miss" is perfectly divided into two
metrics "RMT Load Hit" and "Load Dram".  It's not necessary to keep
metrics "LLC Ld Miss", so remove it.

Before:

  #        ----------- Cacheline ----------      Tot  ------- Load Hitm -------    Total    Total    Total  ---- Stores ----  ----- Core Load Hit -----  - LLC Load Hit --      LLC  --- Load Dram ----
  # Index             Address  Node  PA cnt     Hitm    Total  LclHitm  RmtHitm  records    Loads   Stores    L1Hit   L1Miss       FB       L1       L2    LclHit  LclHitm  Ld Miss       Lcl       Rmt
  # .....  ..................  ....  ......  .......  .......  .......  .......  .......  .......  .......  .......  .......  .......  .......  .......  ........  .......  .......  ........  ........
  #
        0      0x55f07d580100     0    1499   85.89%      481      481        0     7243     3879     3364     2599      765      548     2615       66       169      481        0         0         0
        1      0x55f07d580080     0       1   13.93%       78       78        0      664      664        0        0        0      187      361       27        11       78        0         0         0
        2      0x55f07d5800c0     0       1    0.18%        1        1        0      405      405        0        0        0      131        0       10       263        1        0         0         0

After:

  #        ----------- Cacheline ----------      Tot  ------- Load Hitm -------    Total    Total    Total  ---- Stores ----  ----- Core Load Hit -----  - LLC Load Hit --  - RMT Load Hit --  --- Load Dram ----
  # Index             Address  Node  PA cnt     Hitm    Total  LclHitm  RmtHitm  records    Loads   Stores    L1Hit   L1Miss       FB       L1       L2    LclHit  LclHitm    RmtHit  RmtHitm       Lcl       Rmt
  # .....  ..................  ....  ......  .......  .......  .......  .......  .......  .......  .......  .......  .......  .......  .......  .......  ........  .......  ........  .......  ........  ........
  #
        0      0x55f07d580100     0    1499   85.89%      481      481        0     7243     3879     3364     2599      765      548     2615       66       169      481         0        0         0         0
        1      0x55f07d580080     0       1   13.93%       78       78        0      664      664        0        0        0      187      361       27        11       78         0        0         0         0
        2      0x55f07d5800c0     0       1    0.18%        1        1        0      405      405        0        0        0      131        0       10       263        1         0        0         0         0

Signed-off-by: Leo Yan <leo.yan@linaro.org>
Tested-by: Joe Mario <jmario@redhat.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Link: https://lore.kernel.org/r/20201014050921.5591-9-leo.yan@linaro.org
tools/perf/builtin-c2c.c

index bfbcd63..d5bea5d 100644 (file)
@@ -652,45 +652,6 @@ STAT_FN(ld_l2hit)
 STAT_FN(ld_llchit)
 STAT_FN(rmt_hit)
 
-static uint64_t llc_miss(struct c2c_stats *stats)
-{
-       uint64_t llcmiss;
-
-       llcmiss = stats->lcl_dram +
-                 stats->rmt_dram +
-                 stats->rmt_hitm +
-                 stats->rmt_hit;
-
-       return llcmiss;
-}
-
-static int
-ld_llcmiss_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
-                struct hist_entry *he)
-{
-       struct c2c_hist_entry *c2c_he;
-       int width = c2c_width(fmt, hpp, he->hists);
-
-       c2c_he = container_of(he, struct c2c_hist_entry, he);
-
-       return scnprintf(hpp->buf, hpp->size, "%*lu", width,
-                        llc_miss(&c2c_he->stats));
-}
-
-static int64_t
-ld_llcmiss_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
-              struct hist_entry *left, struct hist_entry *right)
-{
-       struct c2c_hist_entry *c2c_left;
-       struct c2c_hist_entry *c2c_right;
-
-       c2c_left  = container_of(left, struct c2c_hist_entry, he);
-       c2c_right = container_of(right, struct c2c_hist_entry, he);
-
-       return (uint64_t) llc_miss(&c2c_left->stats) -
-              (uint64_t) llc_miss(&c2c_right->stats);
-}
-
 static uint64_t total_records(struct c2c_stats *stats)
 {
        uint64_t lclmiss, ldcnt, total;
@@ -1440,21 +1401,13 @@ static struct c2c_dimension dim_ld_llchit = {
 };
 
 static struct c2c_dimension dim_ld_rmthit = {
-       .header         = HEADER_SPAN_LOW("Rmt"),
+       .header         = HEADER_SPAN("- RMT Load Hit --", "RmtHit", 1),
        .name           = "ld_rmthit",
        .cmp            = rmt_hit_cmp,
        .entry          = rmt_hit_entry,
        .width          = 8,
 };
 
-static struct c2c_dimension dim_ld_llcmiss = {
-       .header         = HEADER_BOTH("LLC", "Ld Miss"),
-       .name           = "ld_llcmiss",
-       .cmp            = ld_llcmiss_cmp,
-       .entry          = ld_llcmiss_entry,
-       .width          = 7,
-};
-
 static struct c2c_dimension dim_tot_recs = {
        .header         = HEADER_BOTH("Total", "records"),
        .name           = "tot_recs",
@@ -1658,7 +1611,6 @@ static struct c2c_dimension *dimensions[] = {
        &dim_ld_l2hit,
        &dim_ld_llchit,
        &dim_ld_rmthit,
-       &dim_ld_llcmiss,
        &dim_tot_recs,
        &dim_tot_loads,
        &dim_percent_hitm,
@@ -2854,7 +2806,7 @@ static int perf_c2c__report(int argc, const char **argv)
                        "stores_l1hit,stores_l1miss,"
                        "ld_fbhit,ld_l1hit,ld_l2hit,"
                        "ld_lclhit,lcl_hitm,"
-                       "ld_llcmiss,"
+                       "ld_rmthit,rmt_hitm,"
                        "dram_lcl,dram_rmt",
                        c2c.display == DISPLAY_TOT ? "tot_hitm" :
                        c2c.display == DISPLAY_LCL ? "lcl_hitm" : "rmt_hitm"