From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935162AbcIVPk3 (ORCPT ); Thu, 22 Sep 2016 11:40:29 -0400 Received: from mx1.redhat.com ([209.132.183.28]:47736 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965357AbcIVPj1 (ORCPT ); Thu, 22 Sep 2016 11:39:27 -0400 From: Jiri Olsa To: Arnaldo Carvalho de Melo Cc: lkml , Don Zickus , Joe Mario , Ingo Molnar , Peter Zijlstra , Namhyung Kim , David Ahern , Andi Kleen Subject: [PATCH 53/57] perf c2c report: Add cacheline index entry Date: Thu, 22 Sep 2016 17:37:21 +0200 Message-Id: <1474558645-19956-54-git-send-email-jolsa@kernel.org> In-Reply-To: <1474558645-19956-1-git-send-email-jolsa@kernel.org> References: <1474558645-19956-1-git-send-email-jolsa@kernel.org> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 22 Sep 2016 15:39:27 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org It's convenient to have an index for each cacheline to help discussions about results over the phone. Add new 'Index' and 'Num' fields in main and single cacheline tables. $ perf c2c report ================================================= Shared Data Cache Line Table ================================================= # # Total Lcl ----- LLC Load Hitm ----- # Index Cacheline records Hitm Total Lcl Rmt ... # ..... .................. ....... ....... ....... ....... ....... # 0 0xffff880036233b40 1 11.11% 1 1 0 1 0xffff88009ccb2900 1 11.11% 1 1 0 2 0xffff8800b5b3bc40 7 11.11% 1 1 0 ... ================================================= Shared Cache Line Distribution Pareto ================================================= # # ----- HITM ----- -- Store Refs -- Data address # Num Rmt Lcl L1 Hit L1 Miss Offset Pid ... # ..... ....... ....... ....... ....... .................. ....... # ------------------------------------------------------------- 0 0 1 0 0 0xffff880036233b40 ------------------------------------------------------------- 0.00% 100.00% 0.00% 0.00% 0x30 0 ------------------------------------------------------------- 1 0 1 0 0 0xffff88009ccb2900 ------------------------------------------------------------- 0.00% 100.00% 0.00% 0.00% 0x28 549 ... Link: http://lkml.kernel.org/n/tip-4dhfagaz57tvrfjbg8nd2h4u@git.kernel.org Signed-off-by: Jiri Olsa --- tools/perf/builtin-c2c.c | 64 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 3 deletions(-) diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c index c7fe81d49016..f39947d29765 100644 --- a/tools/perf/builtin-c2c.c +++ b/tools/perf/builtin-c2c.c @@ -36,6 +36,7 @@ struct c2c_hist_entry { struct c2c_stats stats; unsigned long *cpuset; struct c2c_stats *node_stats; + unsigned int cacheline_idx; struct compute_stats cstats; @@ -1085,6 +1086,29 @@ cpucnt_entry(struct perf_hpp_fmt *fmt __maybe_unused, struct perf_hpp *hpp, return snprintf(hpp->buf, hpp->size, "%*s", width, buf); } +static int +cl_idx_entry(struct perf_hpp_fmt *fmt __maybe_unused, struct perf_hpp *hpp, + struct hist_entry *he) +{ + struct c2c_hist_entry *c2c_he; + int width = c2c_width(fmt, hpp, he->hists); + char buf[10]; + + c2c_he = container_of(he, struct c2c_hist_entry, he); + + snprintf(buf, 10, "%u", c2c_he->cacheline_idx); + return snprintf(hpp->buf, hpp->size, "%*s", width, buf); +} + +static int +cl_idx_empty_entry(struct perf_hpp_fmt *fmt __maybe_unused, struct perf_hpp *hpp, + struct hist_entry *he) +{ + int width = c2c_width(fmt, hpp, he->hists); + + return snprintf(hpp->buf, hpp->size, "%*s", width, ""); +} + #define HEADER_LOW(__h) \ { \ .line[1] = { \ @@ -1430,6 +1454,30 @@ static struct c2c_dimension dim_srcline = { .se = &sort_srcline, }; +static struct c2c_dimension dim_dcacheline_idx = { + .header = HEADER_LOW("Index"), + .name = "cl_idx", + .cmp = empty_cmp, + .entry = cl_idx_entry, + .width = 5, +}; + +static struct c2c_dimension dim_dcacheline_num = { + .header = HEADER_LOW("Num"), + .name = "cl_num", + .cmp = empty_cmp, + .entry = cl_idx_entry, + .width = 5, +}; + +static struct c2c_dimension dim_dcacheline_num_empty = { + .header = HEADER_LOW("Num"), + .name = "cl_num_empty", + .cmp = empty_cmp, + .entry = cl_idx_empty_entry, + .width = 5, +}; + static struct c2c_dimension *dimensions[] = { &dim_dcacheline, &dim_offset, @@ -1469,6 +1517,9 @@ static struct c2c_dimension *dimensions[] = { &dim_mean_load, &dim_cpucnt, &dim_srcline, + &dim_dcacheline_idx, + &dim_dcacheline_num, + &dim_dcacheline_num_empty, NULL, }; @@ -1755,6 +1806,10 @@ static int resort_cl_cb(struct hist_entry *he) calc_width(he); if (display && c2c_hists) { + static unsigned int idx; + + c2c_he->cacheline_idx = idx++; + c2c_hists__reinit(c2c_hists, c2c.cl_output, c2c.cl_resort); hists__collapse_resort(&c2c_hists->hists, NULL); @@ -1942,10 +1997,10 @@ static void print_cacheline(struct c2c_hists *c2c_hists, fprintf(out, "\n"); } - fprintf(out, " ------------------------------------------------------\n"); + fprintf(out, " -------------------------------------------------------------\n"); __hist_entry__snprintf(he_cl, &hpp, hpp_list); fprintf(out, "%s\n", bf); - fprintf(out, " ------------------------------------------------------\n"); + fprintf(out, " -------------------------------------------------------------\n"); hists__fprintf(&c2c_hists->hists, false, 0, 0, 0, out, true); } @@ -1958,6 +2013,7 @@ static void print_pareto(FILE *out) perf_hpp_list__init(&hpp_list); ret = hpp_list__parse(&hpp_list, + "cl_num," "cl_rmt_hitm," "cl_lcl_hitm," "cl_stores_l1hit," @@ -2315,7 +2371,8 @@ static int build_cl_output(char *cl_sort) } if (asprintf(&c2c.cl_output, - "%s%s%s%s%s%s%s%s%s", + "%s%s%s%s%s%s%s%s%s%s", + c2c.use_stdio ? "cl_num_empty," : "", "percent_rmt_hitm," "percent_lcl_hitm," "percent_stores_l1hit," @@ -2464,6 +2521,7 @@ static int perf_c2c__report(int argc, const char **argv) } c2c_hists__reinit(&c2c.hists, + "cl_idx," "dcacheline," "tot_recs," "percent_hitm," -- 2.7.4