From: Leo Yan <leo.yan@linaro.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Leo Yan <leo.yan@linaro.org>
Subject: [PATCH v2 11/14] perf kvm: Support printing attributions for dimensions
Date: Tue, 28 Feb 2023 16:41:44 +0800 [thread overview]
Message-ID: <20230228084147.106167-12-leo.yan@linaro.org> (raw)
In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org>
This patch adds header, entry callback and width for every dimension,
thus in TUI mode the tool can print items with the defined attributions.
Signed-off-by: Leo Yan <leo.yan@linaro.org>
---
tools/perf/builtin-kvm.c | 105 +++++++++++++++++++++++++++++++++++++--
1 file changed, 102 insertions(+), 3 deletions(-)
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index 741ba65bf092..a56d0983c585 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -83,8 +83,12 @@ struct kvm_hists {
struct kvm_dimension {
const char *name;
+ const char *header;
+ int width;
int64_t (*cmp)(struct perf_hpp_fmt *fmt, struct hist_entry *left,
struct hist_entry *right);
+ int (*entry)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+ struct hist_entry *he);
};
struct kvm_fmt {
@@ -102,9 +106,32 @@ empty_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
return 0;
}
+static int fmt_width(struct perf_hpp_fmt *fmt,
+ struct perf_hpp *hpp __maybe_unused,
+ struct hists *hists __maybe_unused);
+
+static int ev_name_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+ struct hist_entry *he)
+{
+ struct kvm_event *event;
+ int width = fmt_width(fmt, hpp, he->hists);
+ char decode[decode_str_len];
+ struct perf_kvm_stat *perf_kvm;
+
+ event = container_of(he, struct kvm_event, he);
+
+ perf_kvm = event->perf_kvm;
+ perf_kvm->events_ops->decode_key(perf_kvm, &event->key, decode);
+
+ return scnprintf(hpp->buf, hpp->size, "%*s", width, decode);
+}
+
static struct kvm_dimension dim_event = {
+ .header = "Event name",
.name = "name",
.cmp = empty_cmp,
+ .entry = ev_name_entry,
+ .width = 40,
};
#define EV_METRIC_CMP(metric) \
@@ -130,29 +157,77 @@ EV_METRIC_CMP(max)
EV_METRIC_CMP(min)
EV_METRIC_CMP(mean)
+#define EV_METRIC_ENTRY(metric) \
+static int ev_entry_##metric(struct perf_hpp_fmt *fmt, \
+ struct perf_hpp *hpp, \
+ struct hist_entry *he) \
+{ \
+ struct kvm_event *event; \
+ int width = fmt_width(fmt, hpp, he->hists); \
+ struct perf_kvm_stat *perf_kvm; \
+ \
+ event = container_of(he, struct kvm_event, he); \
+ perf_kvm = event->perf_kvm; \
+ return scnprintf(hpp->buf, hpp->size, "%*lu", width, \
+ get_event_##metric(event, perf_kvm->trace_vcpu)); \
+}
+
+EV_METRIC_ENTRY(time)
+EV_METRIC_ENTRY(count)
+EV_METRIC_ENTRY(max)
+EV_METRIC_ENTRY(min)
+
static struct kvm_dimension dim_time = {
+ .header = "Time (ns)",
.name = "time",
.cmp = ev_cmp_time,
+ .entry = ev_entry_time,
+ .width = 12,
};
static struct kvm_dimension dim_count = {
+ .header = "Samples",
.name = "sample",
.cmp = ev_cmp_count,
+ .entry = ev_entry_count,
+ .width = 12,
};
static struct kvm_dimension dim_max_time = {
+ .header = "Max Time (ns)",
.name = "max_t",
.cmp = ev_cmp_max,
+ .entry = ev_entry_max,
+ .width = 14,
};
static struct kvm_dimension dim_min_time = {
+ .header = "Min Time (ns)",
.name = "min_t",
.cmp = ev_cmp_min,
+ .entry = ev_entry_min,
+ .width = 14,
};
+static int ev_entry_mean(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+ struct hist_entry *he)
+{
+ struct kvm_event *event;
+ int width = fmt_width(fmt, hpp, he->hists);
+ struct perf_kvm_stat *perf_kvm;
+
+ event = container_of(he, struct kvm_event, he);
+ perf_kvm = event->perf_kvm;
+ return scnprintf(hpp->buf, hpp->size, "%*lu", width,
+ get_event_mean(event, perf_kvm->trace_vcpu));
+}
+
static struct kvm_dimension dim_mean_time = {
+ .header = "Mean Time (ns)",
.name = "mean_t",
.cmp = ev_cmp_mean,
+ .entry = ev_entry_mean,
+ .width = 14,
};
static struct kvm_dimension *dimensions[] = {
@@ -165,6 +240,30 @@ static struct kvm_dimension *dimensions[] = {
NULL,
};
+static int fmt_width(struct perf_hpp_fmt *fmt,
+ struct perf_hpp *hpp __maybe_unused,
+ struct hists *hists __maybe_unused)
+{
+ struct kvm_fmt *kvm_fmt;
+
+ kvm_fmt = container_of(fmt, struct kvm_fmt, fmt);
+ return kvm_fmt->dim->width;
+}
+
+static int fmt_header(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
+ struct hists *hists, int line __maybe_unused,
+ int *span __maybe_unused)
+{
+ struct kvm_fmt *kvm_fmt;
+ struct kvm_dimension *dim;
+ int width = fmt_width(fmt, hpp, hists);
+
+ kvm_fmt = container_of(fmt, struct kvm_fmt, fmt);
+ dim = kvm_fmt->dim;
+
+ return scnprintf(hpp->buf, hpp->size, "%*s", width, dim->header);
+}
+
static bool fmt_equal(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b)
{
struct kvm_fmt *kvm_fmt_a = container_of(a, struct kvm_fmt, fmt);
@@ -214,9 +313,9 @@ static struct kvm_fmt *get_format(const char *name)
fmt->cmp = dim->cmp;
fmt->sort = dim->cmp;
fmt->color = NULL;
- fmt->entry = NULL;
- fmt->header = NULL;
- fmt->width = NULL;
+ fmt->entry = dim->entry;
+ fmt->header = fmt_header;
+ fmt->width = fmt_width;
fmt->collapse = dim->cmp;
fmt->equal = fmt_equal;
fmt->free = fmt_free;
--
2.34.1
next prev parent reply other threads:[~2023-02-28 8:43 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-28 8:41 [PATCH v2 00/14] perf kvm: Support histograms and TUI mode Leo Yan
2023-02-28 8:41 ` [PATCH v2 01/14] perf kvm: Refactor overall statistics Leo Yan
2023-02-28 8:41 ` [PATCH v2 02/14] perf kvm: Add pointer to 'perf_kvm_stat' in kvm event Leo Yan
2023-02-28 8:41 ` [PATCH v2 03/14] perf kvm: Move up metrics helpers Leo Yan
2023-02-28 8:41 ` [PATCH v2 04/14] perf kvm: Use subtraction for comparison metrics Leo Yan
2023-02-28 8:41 ` [PATCH v2 05/14] perf kvm: Introduce histograms data structures Leo Yan
2023-02-28 8:41 ` [PATCH v2 06/14] perf kvm: Pass argument 'sample' to kvm_alloc_init_event() Leo Yan
2023-02-28 8:41 ` [PATCH v2 07/14] perf kvm: Parse address location for samples Leo Yan
2023-02-28 8:41 ` [PATCH v2 08/14] perf kvm: Add dimensions for KVM event statistics Leo Yan
2023-02-28 8:41 ` [PATCH v2 09/14] perf kvm: Use histograms list to replace cached list Leo Yan
2023-02-28 8:41 ` [PATCH v2 10/14] perf kvm: Polish sorting key Leo Yan
2023-02-28 8:41 ` Leo Yan [this message]
2023-02-28 8:41 ` [PATCH v2 12/14] perf kvm: Add dimensions for percentages Leo Yan
2023-02-28 8:41 ` [PATCH v2 13/14] perf kvm: Add TUI mode for stat report Leo Yan
2023-02-28 11:12 ` James Clark
2023-02-28 11:35 ` Leo Yan
2023-02-28 8:41 ` [PATCH v2 14/14] perf kvm: Update documentation to reflect new changes Leo Yan
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=20230228084147.106167-12-leo.yan@linaro.org \
--to=leo.yan@linaro.org \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
/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 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).