perf c2c: Add metrics "RMT Load Hit"

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
This commit is contained in:
Leo Yan 2020-10-14 06:09:21 +01:00 committed by Arnaldo Carvalho de Melo
parent 77c158698c
commit 91d933c221

View File

@ -652,45 +652,6 @@ STAT_FN(ld_l2hit)
STAT_FN(ld_llchit) STAT_FN(ld_llchit)
STAT_FN(rmt_hit) 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) static uint64_t total_records(struct c2c_stats *stats)
{ {
uint64_t lclmiss, ldcnt, total; uint64_t lclmiss, ldcnt, total;
@ -1440,21 +1401,13 @@ static struct c2c_dimension dim_ld_llchit = {
}; };
static struct c2c_dimension dim_ld_rmthit = { static struct c2c_dimension dim_ld_rmthit = {
.header = HEADER_SPAN_LOW("Rmt"), .header = HEADER_SPAN("- RMT Load Hit --", "RmtHit", 1),
.name = "ld_rmthit", .name = "ld_rmthit",
.cmp = rmt_hit_cmp, .cmp = rmt_hit_cmp,
.entry = rmt_hit_entry, .entry = rmt_hit_entry,
.width = 8, .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 = { static struct c2c_dimension dim_tot_recs = {
.header = HEADER_BOTH("Total", "records"), .header = HEADER_BOTH("Total", "records"),
.name = "tot_recs", .name = "tot_recs",
@ -1658,7 +1611,6 @@ static struct c2c_dimension *dimensions[] = {
&dim_ld_l2hit, &dim_ld_l2hit,
&dim_ld_llchit, &dim_ld_llchit,
&dim_ld_rmthit, &dim_ld_rmthit,
&dim_ld_llcmiss,
&dim_tot_recs, &dim_tot_recs,
&dim_tot_loads, &dim_tot_loads,
&dim_percent_hitm, &dim_percent_hitm,
@ -2854,7 +2806,7 @@ static int perf_c2c__report(int argc, const char **argv)
"stores_l1hit,stores_l1miss," "stores_l1hit,stores_l1miss,"
"ld_fbhit,ld_l1hit,ld_l2hit," "ld_fbhit,ld_l1hit,ld_l2hit,"
"ld_lclhit,lcl_hitm," "ld_lclhit,lcl_hitm,"
"ld_llcmiss," "ld_rmthit,rmt_hitm,"
"dram_lcl,dram_rmt", "dram_lcl,dram_rmt",
c2c.display == DISPLAY_TOT ? "tot_hitm" : c2c.display == DISPLAY_TOT ? "tot_hitm" :
c2c.display == DISPLAY_LCL ? "lcl_hitm" : "rmt_hitm" c2c.display == DISPLAY_LCL ? "lcl_hitm" : "rmt_hitm"