lkml.org 
[lkml]   [2016]   [Sep]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 34/61] perf c2c report: Add hitm/store percent related sort keys
    Date
    Adding hitm/store percent dimension key wrappers.

    They are to be displayed in the single cacheline output:

    percent_rmt_hitm, percent_lcl_hitm, percent_stores_l1hit, percent_stores_l1miss

    They display percentage of HITMs/stores for specific
    offset in the cacheline.

    Link: http://lkml.kernel.org/n/tip-t365aosxtdut8sgrgn8mfoe4@git.kernel.org
    Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    ---
    tools/perf/builtin-c2c.c | 206 +++++++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 206 insertions(+)

    diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c
    index 82ad66e71401..0613669cd8b4 100644
    --- a/tools/perf/builtin-c2c.c
    +++ b/tools/perf/builtin-c2c.c
    @@ -642,6 +642,171 @@ percent_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
    return per_left - per_right;
    }

    +static struct c2c_stats *he_stats(struct hist_entry *he)
    +{
    + struct c2c_hist_entry *c2c_he;
    +
    + c2c_he = container_of(he, struct c2c_hist_entry, he);
    + return &c2c_he->stats;
    +}
    +
    +static struct c2c_stats *total_stats(struct hist_entry *he)
    +{
    + struct c2c_hists *hists;
    +
    + hists = container_of(he->hists, struct c2c_hists, hists);
    + return &hists->stats;
    +}
    +
    +static double percent(int st, int tot)
    +{
    + return tot ? 100. * (double) st / (double) tot : 0;
    +}
    +
    +#define PERCENT(__h, __f) percent(he_stats(__h)->__f, total_stats(__h)->__f)
    +
    +#define PERCENT_FN(__f) \
    +static double percent_ ## __f(struct c2c_hist_entry *c2c_he) \
    +{ \
    + struct c2c_hists *hists; \
    + \
    + hists = container_of(c2c_he->he.hists, struct c2c_hists, hists); \
    + return percent(c2c_he->stats.__f, hists->stats.__f); \
    +}
    +
    +PERCENT_FN(rmt_hitm)
    +PERCENT_FN(lcl_hitm)
    +PERCENT_FN(st_l1hit)
    +PERCENT_FN(st_l1miss)
    +
    +static int
    +percent_rmt_hitm_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, rmt_hitm);
    + char buf[10];
    +
    + snprintf(buf, 10, "%.2F%%", per);
    + return snprintf(hpp->buf, hpp->size, "%*s", width, buf);
    +}
    +
    +static int
    +percent_rmt_hitm_color(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
    + struct hist_entry *he)
    +{
    + return percent_color(fmt, hpp, he, percent_rmt_hitm);
    +}
    +
    +static int64_t
    +percent_rmt_hitm_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, lcl_hitm);
    + per_right = PERCENT(right, lcl_hitm);
    +
    + return per_left - per_right;
    +}
    +
    +static int
    +percent_lcl_hitm_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, lcl_hitm);
    + char buf[10];
    +
    + snprintf(buf, 10, "%.2F%%", per);
    + return snprintf(hpp->buf, hpp->size, "%*s", width, buf);
    +}
    +
    +static int
    +percent_lcl_hitm_color(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
    + struct hist_entry *he)
    +{
    + return percent_color(fmt, hpp, he, percent_lcl_hitm);
    +}
    +
    +static int64_t
    +percent_lcl_hitm_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, lcl_hitm);
    + per_right = PERCENT(right, lcl_hitm);
    +
    + return per_left - per_right;
    +}
    +
    +static int
    +percent_stores_l1hit_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_l1hit);
    + char buf[10];
    +
    + snprintf(buf, 10, "%.2F%%", per);
    + return snprintf(hpp->buf, hpp->size, "%*s", width, buf);
    +}
    +
    +static int
    +percent_stores_l1hit_color(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
    + struct hist_entry *he)
    +{
    + return percent_color(fmt, hpp, he, percent_st_l1hit);
    +}
    +
    +static int64_t
    +percent_stores_l1hit_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_l1hit);
    + per_right = PERCENT(right, st_l1hit);
    +
    + return per_left - per_right;
    +}
    +
    +static int
    +percent_stores_l1miss_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_l1miss);
    + char buf[10];
    +
    + snprintf(buf, 10, "%.2F%%", per);
    + return snprintf(hpp->buf, hpp->size, "%*s", width, buf);
    +}
    +
    +static int
    +percent_stores_l1miss_color(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
    + struct hist_entry *he)
    +{
    + return percent_color(fmt, hpp, he, percent_st_l1miss);
    +}
    +
    +static int64_t
    +percent_stores_l1miss_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_l1miss);
    + per_right = PERCENT(right, st_l1miss);
    +
    + return per_left - per_right;
    +}
    +
    #define HEADER_LOW(__h) \
    { \
    .line[1] = { \
    @@ -854,6 +1019,42 @@ static struct c2c_dimension dim_percent_hitm = {
    .width = 7,
    };

    +static struct c2c_dimension dim_percent_rmt_hitm = {
    + .header = HEADER_SPAN("----- HITM -----", "Rmt", 1),
    + .name = "percent_rmt_hitm",
    + .cmp = percent_rmt_hitm_cmp,
    + .entry = percent_rmt_hitm_entry,
    + .color = percent_rmt_hitm_color,
    + .width = 7,
    +};
    +
    +static struct c2c_dimension dim_percent_lcl_hitm = {
    + .header = HEADER_SPAN_LOW("Lcl"),
    + .name = "percent_lcl_hitm",
    + .cmp = percent_lcl_hitm_cmp,
    + .entry = percent_lcl_hitm_entry,
    + .color = percent_lcl_hitm_color,
    + .width = 7,
    +};
    +
    +static struct c2c_dimension dim_percent_stores_l1hit = {
    + .header = HEADER_SPAN("-- Store Refs --", "L1 Hit", 1),
    + .name = "percent_stores_l1hit",
    + .cmp = percent_stores_l1hit_cmp,
    + .entry = percent_stores_l1hit_entry,
    + .color = percent_stores_l1hit_color,
    + .width = 7,
    +};
    +
    +static struct c2c_dimension dim_percent_stores_l1miss = {
    + .header = HEADER_SPAN_LOW("L1 Miss"),
    + .name = "percent_stores_l1miss",
    + .cmp = percent_stores_l1miss_cmp,
    + .entry = percent_stores_l1miss_entry,
    + .color = percent_stores_l1miss_color,
    + .width = 7,
    +};
    +
    #undef HEADER_LOW
    #undef HEADER_BOTH
    #undef HEADER_SPAN
    @@ -882,6 +1083,10 @@ static struct c2c_dimension *dimensions[] = {
    &dim_tot_recs,
    &dim_tot_loads,
    &dim_percent_hitm,
    + &dim_percent_rmt_hitm,
    + &dim_percent_lcl_hitm,
    + &dim_percent_stores_l1hit,
    + &dim_percent_stores_l1miss,
    NULL,
    };

    @@ -969,6 +1174,7 @@ static struct c2c_fmt *get_format(const char *name)

    fmt->cmp = dim->se ? c2c_se_cmp : dim->cmp;
    fmt->sort = dim->se ? c2c_se_cmp : dim->cmp;
    + fmt->color = dim->se ? NULL : dim->color;
    fmt->entry = dim->se ? c2c_se_entry : dim->entry;
    fmt->header = c2c_header;
    fmt->width = c2c_width;
    --
    2.7.4
    \
     
     \ /
      Last update: 2016-09-19 15:22    [W:4.038 / U:0.156 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site