lkml.org 
[lkml]   [2022]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 06/17] perf mem: Add statistics for peer snooping
    Date
    Since the flag PERF_MEM_SNOOPX_PEER is added to support cache snooping
    from peer cache line, it can come from a peer core, a peer cluster, or
    a remote NUMA node.

    This patch adds statistics for the flag PERF_MEM_SNOOPX_PEER. Note, we
    take PERF_MEM_SNOOPX_PEER as an affiliated info, it needs to cooperate
    with cache level statistics. Therefore, we account the load operations
    for both the cache level's metrics (e.g. ld_l2hit, ld_llchit, etc.) and
    peer related metrics when flag PERF_MEM_SNOOPX_PEER is set.

    So three new metrics are introduced: 'lcl_peer' is for local cache
    access, the metric 'rmt_peer' is for remote access (includes remote DRAM
    and any caches in remote node), and the metric 'tot_peer' is accounting
    the sum value of 'lcl_peer' and 'rmt_peer'.

    Signed-off-by: Leo Yan <leo.yan@linaro.org>
    Acked-by: Ian Rogers <irogers@google.com>
    Tested-by: Ali Saidi <alisaidi@amazon.com>
    Reviewed-by: Ali Saidi <alisaidi@amazon.com>
    ---
    tools/perf/util/mem-events.c | 28 +++++++++++++++++++++++++---
    tools/perf/util/mem-events.h | 3 +++
    2 files changed, 28 insertions(+), 3 deletions(-)

    diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
    index 5dca1882c284..764883183519 100644
    --- a/tools/perf/util/mem-events.c
    +++ b/tools/perf/util/mem-events.c
    @@ -525,6 +525,7 @@ int c2c_decode_stats(struct c2c_stats *stats, struct mem_info *mi)
    u64 op = data_src->mem_op;
    u64 lvl = data_src->mem_lvl;
    u64 snoop = data_src->mem_snoop;
    + u64 snoopx = data_src->mem_snoopx;
    u64 lock = data_src->mem_lock;
    u64 blk = data_src->mem_blk;
    /*
    @@ -544,6 +545,12 @@ do { \
    stats->tot_hitm++; \
    } while (0)

    +#define PEER_INC(__f) \
    +do { \
    + stats->__f++; \
    + stats->tot_peer++; \
    +} while (0)
    +
    #define P(a, b) PERF_MEM_##a##_##b

    stats->nr_entries++;
    @@ -567,12 +574,20 @@ do { \
    if (lvl & P(LVL, IO)) stats->ld_io++;
    if (lvl & P(LVL, LFB)) stats->ld_fbhit++;
    if (lvl & P(LVL, L1 )) stats->ld_l1hit++;
    - if (lvl & P(LVL, L2 )) stats->ld_l2hit++;
    + if (lvl & P(LVL, L2)) {
    + stats->ld_l2hit++;
    +
    + if (snoopx & P(SNOOPX, PEER))
    + PEER_INC(lcl_peer);
    + }
    if (lvl & P(LVL, L3 )) {
    if (snoop & P(SNOOP, HITM))
    HITM_INC(lcl_hitm);
    else
    stats->ld_llchit++;
    +
    + if (snoopx & P(SNOOPX, PEER))
    + PEER_INC(lcl_peer);
    }

    if (lvl & P(LVL, LOC_RAM)) {
    @@ -597,10 +612,14 @@ do { \
    if ((lvl & P(LVL, REM_CCE1)) ||
    (lvl & P(LVL, REM_CCE2)) ||
    mrem) {
    - if (snoop & P(SNOOP, HIT))
    + if (snoop & P(SNOOP, HIT)) {
    stats->rmt_hit++;
    - else if (snoop & P(SNOOP, HITM))
    + } else if (snoop & P(SNOOP, HITM)) {
    HITM_INC(rmt_hitm);
    + } else if (snoopx & P(SNOOPX, PEER)) {
    + stats->rmt_hit++;
    + PEER_INC(rmt_peer);
    + }
    }

    if ((lvl & P(LVL, MISS)))
    @@ -664,6 +683,9 @@ void c2c_add_stats(struct c2c_stats *stats, struct c2c_stats *add)
    stats->lcl_hitm += add->lcl_hitm;
    stats->rmt_hitm += add->rmt_hitm;
    stats->tot_hitm += add->tot_hitm;
    + stats->lcl_peer += add->lcl_peer;
    + stats->rmt_peer += add->rmt_peer;
    + stats->tot_peer += add->tot_peer;
    stats->rmt_hit += add->rmt_hit;
    stats->lcl_dram += add->lcl_dram;
    stats->rmt_dram += add->rmt_dram;
    diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
    index 8a8b568baeee..12372309d60e 100644
    --- a/tools/perf/util/mem-events.h
    +++ b/tools/perf/util/mem-events.h
    @@ -78,6 +78,9 @@ struct c2c_stats {
    u32 lcl_hitm; /* count of loads with local HITM */
    u32 rmt_hitm; /* count of loads with remote HITM */
    u32 tot_hitm; /* count of loads with local and remote HITM */
    + u32 lcl_peer; /* count of loads with local peer cache */
    + u32 rmt_peer; /* count of loads with remote peer cache */
    + u32 tot_peer; /* count of loads with local and remote peer cache */
    u32 rmt_hit; /* count of loads with remote hit clean; */
    u32 lcl_dram; /* count of loads miss to local DRAM */
    u32 rmt_dram; /* count of loads miss to remote DRAM */
    --
    2.25.1
    \
     
     \ /
      Last update: 2022-06-04 06:30    [W:4.107 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site