lkml.org 
[lkml]   [2016]   [Feb]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/core] perf tools: Introduce perf_mem__lvl_scnprintf function
    Commit-ID:  071e9a1e12dceaec6f9d3ffe6e77ee68364166d6
    Gitweb: http://git.kernel.org/tip/071e9a1e12dceaec6f9d3ffe6e77ee68364166d6
    Author: Jiri Olsa <jolsa@kernel.org>
    AuthorDate: Wed, 24 Feb 2016 09:46:47 +0100
    Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
    CommitDate: Wed, 24 Feb 2016 10:20:28 -0300

    perf tools: Introduce perf_mem__lvl_scnprintf function

    Move meminfo's lvl display function into mem-events.c object, so it
    could be reused later from script code.

    Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Stephane Eranian <eranian@google.com>
    Link: http://lkml.kernel.org/r/1456303616-26926-7-git-send-email-jolsa@kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/util/mem-events.c | 53 ++++++++++++++++++++++++++++++++++++++++++++
    tools/perf/util/mem-events.h | 1 +
    tools/perf/util/sort.c | 50 +----------------------------------------
    3 files changed, 55 insertions(+), 49 deletions(-)

    diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
    index 4be3eb7..bddb121 100644
    --- a/tools/perf/util/mem-events.c
    +++ b/tools/perf/util/mem-events.c
    @@ -130,3 +130,56 @@ void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
    if (miss)
    strncat(out, " miss", sz - l);
    }
    +
    +static const char * const mem_lvl[] = {
    + "N/A",
    + "HIT",
    + "MISS",
    + "L1",
    + "LFB",
    + "L2",
    + "L3",
    + "Local RAM",
    + "Remote RAM (1 hop)",
    + "Remote RAM (2 hops)",
    + "Remote Cache (1 hop)",
    + "Remote Cache (2 hops)",
    + "I/O",
    + "Uncached",
    +};
    +
    +void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
    +{
    + size_t i, l = 0;
    + u64 m = PERF_MEM_LVL_NA;
    + u64 hit, miss;
    +
    + if (mem_info)
    + m = mem_info->data_src.mem_lvl;
    +
    + sz -= 1; /* -1 for null termination */
    + out[0] = '\0';
    +
    + hit = m & PERF_MEM_LVL_HIT;
    + miss = m & PERF_MEM_LVL_MISS;
    +
    + /* already taken care of */
    + m &= ~(PERF_MEM_LVL_HIT|PERF_MEM_LVL_MISS);
    +
    + for (i = 0; m && i < ARRAY_SIZE(mem_lvl); i++, m >>= 1) {
    + if (!(m & 0x1))
    + continue;
    + if (l) {
    + strcat(out, " or ");
    + l += 4;
    + }
    + strncat(out, mem_lvl[i], sz - l);
    + l += strlen(mem_lvl[i]);
    + }
    + if (*out == '\0')
    + strcpy(out, "N/A");
    + if (hit)
    + strncat(out, " hit", sz - l);
    + if (miss)
    + strncat(out, " miss", sz - l);
    +}
    diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
    index d8fb8e1..bd0d7f7 100644
    --- a/tools/perf/util/mem-events.h
    +++ b/tools/perf/util/mem-events.h
    @@ -26,4 +26,5 @@ char *perf_mem_events__name(int i);

    struct mem_info;
    void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
    +void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
    #endif /* __PERF_MEM_EVENTS_H */
    diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
    index 160df20..d894759 100644
    --- a/tools/perf/util/sort.c
    +++ b/tools/perf/util/sort.c
    @@ -858,60 +858,12 @@ sort__lvl_cmp(struct hist_entry *left, struct hist_entry *right)
    return (int64_t)(data_src_r.mem_lvl - data_src_l.mem_lvl);
    }

    -static const char * const mem_lvl[] = {
    - "N/A",
    - "HIT",
    - "MISS",
    - "L1",
    - "LFB",
    - "L2",
    - "L3",
    - "Local RAM",
    - "Remote RAM (1 hop)",
    - "Remote RAM (2 hops)",
    - "Remote Cache (1 hop)",
    - "Remote Cache (2 hops)",
    - "I/O",
    - "Uncached",
    -};
    -
    static int hist_entry__lvl_snprintf(struct hist_entry *he, char *bf,
    size_t size, unsigned int width)
    {
    char out[64];
    - size_t sz = sizeof(out) - 1; /* -1 for null termination */
    - size_t i, l = 0;
    - u64 m = PERF_MEM_LVL_NA;
    - u64 hit, miss;
    -
    - if (he->mem_info)
    - m = he->mem_info->data_src.mem_lvl;
    -
    - out[0] = '\0';
    -
    - hit = m & PERF_MEM_LVL_HIT;
    - miss = m & PERF_MEM_LVL_MISS;
    -
    - /* already taken care of */
    - m &= ~(PERF_MEM_LVL_HIT|PERF_MEM_LVL_MISS);
    -
    - for (i = 0; m && i < ARRAY_SIZE(mem_lvl); i++, m >>= 1) {
    - if (!(m & 0x1))
    - continue;
    - if (l) {
    - strcat(out, " or ");
    - l += 4;
    - }
    - strncat(out, mem_lvl[i], sz - l);
    - l += strlen(mem_lvl[i]);
    - }
    - if (*out == '\0')
    - strcpy(out, "N/A");
    - if (hit)
    - strncat(out, " hit", sz - l);
    - if (miss)
    - strncat(out, " miss", sz - l);

    + perf_mem__lvl_scnprintf(out, sizeof(out), he->mem_info);
    return repsep_snprintf(bf, size, "%-*s", width, out);
    }

    \
     
     \ /
      Last update: 2016-02-25 09:21    [W:4.097 / U:0.280 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site