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
next prev 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 \
/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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.