LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: Jin Yao <yao.jin@linux.intel.com>
To: acme@kernel.org, jolsa@kernel.org, peterz@infradead.org,
	mingo@redhat.com, alexander.shishkin@linux.intel.com
Cc: Linux-kernel@vger.kernel.org, ak@linux.intel.com,
	kan.liang@intel.com, yao.jin@intel.com,
	Jin Yao <yao.jin@linux.intel.com>
Subject: [PATCH v1 09/14] perf util: Add new block info fmts for showing hot blocks comparison
Date: Tue, 10 Mar 2020 15:02:40 +0800	[thread overview]
Message-ID: <20200310070245.16314-10-yao.jin@linux.intel.com> (raw)
In-Reply-To: <20200310070245.16314-1-yao.jin@linux.intel.com>

We support three new columns in output

New Stream Diff(cycles%,cycles):
  The diff of 'Sampled Cycles%' and 'Avg Cycles' between new stream
  and old stream for the same block.

  If block is not matched, it reports "[block not in new stream]" or
  "[block changed in new stream]".

New Stream Sampled Cycles%:
  The 'Sampled Cycles%' of the block in new stream. It's only reported
  when the block is changed in new stream.

New Stream Avg Cycles:
  The 'Average Cycles' of the block in new stream. It's only reported
  when the block is changed in new stream.

Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
---
 tools/perf/util/block-info.c | 117 ++++++++++++++++++++++++++++++++++-
 tools/perf/util/block-info.h |   4 ++
 2 files changed, 120 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/block-info.c b/tools/perf/util/block-info.c
index 247c87b8df56..2ad9e2dd7f77 100644
--- a/tools/perf/util/block-info.c
+++ b/tools/perf/util/block-info.c
@@ -41,7 +41,19 @@ static struct block_header_column {
 	[PERF_HPP_REPORT__BLOCK_DSO] = {
 		.name = "Shared Object",
 		.width = 20,
-	}
+	},
+	[PERF_HPP__BLOCK_NEW_STREAM_DIFF] = {
+		.name = "New Stream Diff(cycles%,cycles)",
+		.width = 31,
+	},
+	[PERF_HPP__BLOCK_NEW_STREAM_TOTAL_CYCLES_PCT] = {
+		.name = "New Stream Sampled Cycles%",
+		.width = 26,
+	},
+	[PERF_HPP__BLOCK_NEW_STREAM_AVG_CYCLES] = {
+		.name = "New Stream Avg Cycles",
+		.width = 21,
+	},
 };
 
 struct block_info *block_info__get(struct block_info *bi)
@@ -342,6 +354,100 @@ static int block_dso_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
 			 "[unknown]");
 }
 
+static int block_new_stream_diff_entry(struct perf_hpp_fmt *fmt,
+				       struct perf_hpp *hpp,
+				       struct hist_entry *he)
+{
+	struct block_fmt *block_fmt = container_of(fmt, struct block_fmt, fmt);
+	struct hist_entry *pair = hist_entry__next_pair(he);
+	struct block_info *bi_h, *bi_p;
+	double ratio_h = 0.0, ratio_p = 0.0;
+	s64 cycles_diff;
+	char buf[32];
+
+	if (!pair) {
+		return scnprintf(hpp->buf, hpp->size, "%*s", block_fmt->width,
+				 "[block not in new stream]");
+	}
+
+	bi_h = he->block_info;
+	bi_p = pair->block_info;
+
+	if (bi_p->block_changed) {
+		return scnprintf(hpp->buf, hpp->size, "%*s", block_fmt->width,
+				 "[block changed in new stream]");
+	}
+
+	if (bi_h->total_cycles)
+		ratio_h = (double)bi_h->cycles / (double)bi_h->total_cycles;
+
+	if (bi_p->total_cycles)
+		ratio_p = (double)bi_p->cycles / (double)bi_p->total_cycles;
+
+	cycles_diff = (s64)(bi_p->cycles_aggr / bi_p->num_aggr) -
+		(s64)(bi_h->cycles_aggr / bi_h->num_aggr);
+
+	snprintf(buf, sizeof(buf), "%4.2f%%, %4ld",
+		 100.0 * (ratio_p - ratio_h), cycles_diff);
+
+	return scnprintf(hpp->buf, hpp->size, "%*s", block_fmt->width, buf);
+}
+
+static int block_new_stream_total_cycles_pct_entry(struct perf_hpp_fmt *fmt,
+						   struct perf_hpp *hpp,
+						   struct hist_entry *he)
+{
+	struct block_fmt *block_fmt = container_of(fmt, struct block_fmt, fmt);
+	struct hist_entry *pair = hist_entry__next_pair(he);
+	struct block_info *bi_p;
+	double ratio = 0.0;
+
+	if (!pair) {
+		return scnprintf(hpp->buf, hpp->size, "%*s", block_fmt->width,
+				 "-");
+	}
+
+	bi_p = pair->block_info;
+
+	if (!bi_p->block_changed) {
+		return scnprintf(hpp->buf, hpp->size, "%*s", block_fmt->width,
+				 "-");
+	}
+
+	if (bi_p->total_cycles)
+		ratio = (double)bi_p->cycles / (double)bi_p->total_cycles;
+
+	return color_pct(hpp, block_fmt->width, 100.0 * ratio);
+}
+
+static int block_new_stream_avg_cycles_entry(struct perf_hpp_fmt *fmt,
+					     struct perf_hpp *hpp,
+					     struct hist_entry *he)
+{
+	struct block_fmt *block_fmt = container_of(fmt, struct block_fmt, fmt);
+	struct hist_entry *pair = hist_entry__next_pair(he);
+	struct block_info *bi_p;
+	char cycles_buf[16];
+
+	if (!pair) {
+		return scnprintf(hpp->buf, hpp->size, "%*s", block_fmt->width,
+				 "-");
+	}
+
+	bi_p = pair->block_info;
+
+	if (!bi_p->block_changed) {
+		return scnprintf(hpp->buf, hpp->size, "%*s", block_fmt->width,
+				 "-");
+	}
+
+	cycles_string(bi_p->cycles_aggr / bi_p->num_aggr, cycles_buf,
+		      sizeof(cycles_buf));
+
+	return scnprintf(hpp->buf, hpp->size, "%*s", block_fmt->width,
+			 cycles_buf);
+}
+
 static void init_block_header(struct block_fmt *block_fmt)
 {
 	struct perf_hpp_fmt *fmt = &block_fmt->fmt;
@@ -385,6 +491,15 @@ static void hpp_register(struct block_fmt *block_fmt, int idx,
 	case PERF_HPP_REPORT__BLOCK_DSO:
 		fmt->entry = block_dso_entry;
 		break;
+	case PERF_HPP__BLOCK_NEW_STREAM_DIFF:
+		fmt->entry = block_new_stream_diff_entry;
+		break;
+	case PERF_HPP__BLOCK_NEW_STREAM_TOTAL_CYCLES_PCT:
+		fmt->entry = block_new_stream_total_cycles_pct_entry;
+		break;
+	case PERF_HPP__BLOCK_NEW_STREAM_AVG_CYCLES:
+		fmt->entry = block_new_stream_avg_cycles_entry;
+		break;
 	default:
 		return;
 	}
diff --git a/tools/perf/util/block-info.h b/tools/perf/util/block-info.h
index 458bd998089d..4e22bce81731 100644
--- a/tools/perf/util/block-info.h
+++ b/tools/perf/util/block-info.h
@@ -22,6 +22,7 @@ struct block_info {
 	refcount_t		refcnt;
 	struct block_line	*line;
 	bool			srcline_matched;
+	bool			block_changed;
 };
 
 struct block_fmt {
@@ -40,6 +41,9 @@ enum {
 	PERF_HPP_REPORT__BLOCK_AVG_CYCLES,
 	PERF_HPP_REPORT__BLOCK_RANGE,
 	PERF_HPP_REPORT__BLOCK_DSO,
+	PERF_HPP__BLOCK_NEW_STREAM_DIFF,
+	PERF_HPP__BLOCK_NEW_STREAM_TOTAL_CYCLES_PCT,
+	PERF_HPP__BLOCK_NEW_STREAM_AVG_CYCLES,
 	PERF_HPP_REPORT__BLOCK_MAX_INDEX
 };
 
-- 
2.17.1


  parent reply	other threads:[~2020-03-10  7:03 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-10  7:02 [PATCH v1 00/14] perf: Stream comparison Jin Yao
2020-03-10  7:02 ` [PATCH v1 01/14] perf util: Create source line mapping table Jin Yao
2020-03-10 15:08   ` Arnaldo Carvalho de Melo
2020-03-11  5:33     ` Jin, Yao
2020-03-10  7:02 ` [PATCH v1 02/14] perf util: Create streams for managing top N hottest callchains Jin Yao
2020-03-10 15:11   ` Arnaldo Carvalho de Melo
2020-03-11  5:38     ` Jin, Yao
2020-03-10  7:02 ` [PATCH v1 03/14] perf util: Return per-event callchain streams Jin Yao
2020-03-10  7:02 ` [PATCH v1 04/14] perf util: Compare two streams Jin Yao
2020-03-10  7:02 ` [PATCH v1 05/14] perf util: Calculate the sum of all streams hits Jin Yao
2020-03-10 15:14   ` Arnaldo Carvalho de Melo
2020-03-11  5:44     ` Jin, Yao
2020-03-10  7:02 ` [PATCH v1 06/14] perf util: Report hot streams Jin Yao
2020-03-10  7:02 ` [PATCH v1 07/14] perf diff: Support hot streams comparison Jin Yao
2020-03-10  7:02 ` [PATCH v1 08/14] perf util: Add new block info functions for top N hot blocks comparison Jin Yao
2020-03-10 15:17   ` Arnaldo Carvalho de Melo
2020-03-11  5:47     ` Jin, Yao
2020-03-10  7:02 ` Jin Yao [this message]
2020-03-10  7:02 ` [PATCH v1 10/14] perf util: Enable block source line comparison Jin Yao
2020-03-10  7:02 ` [PATCH v1 11/14] perf diff: support hot blocks comparison Jin Yao
2020-03-10  7:02 ` [PATCH v1 12/14] perf util: Filter out streams by name of changed functions Jin Yao
2020-03-10  7:02 ` [PATCH v1 13/14] perf util: Filter out blocks " Jin Yao
2020-03-10  7:02 ` [PATCH v1 14/14] perf diff: Filter out streams by " Jin Yao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200310070245.16314-10-yao.jin@linux.intel.com \
    --to=yao.jin@linux.intel.com \
    --cc=Linux-kernel@vger.kernel.org \
    --cc=acme@kernel.org \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=jolsa@kernel.org \
    --cc=kan.liang@intel.com \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.org \
    --cc=yao.jin@intel.com \
    --subject='Re: [PATCH v1 09/14] perf util: Add new block info fmts for showing hot blocks comparison' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).