From: Namhyung Kim <namhyung@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Jiri Olsa <jolsa@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
David Ahern <dsahern@gmail.com>,
Steven Rostedt <rostedt@goodmis.org>,
Frederic Weisbecker <fweisbec@gmail.com>,
Andi Kleen <andi@firstfloor.org>, Wang Nan <wangnan0@huawei.com>
Subject: [PATCH 06/10] perf tools: Try to show pretty printed output for dynamic sort keys
Date: Wed, 16 Dec 2015 00:35:39 +0900 [thread overview]
Message-ID: <1450193743-4409-7-git-send-email-namhyung@kernel.org> (raw)
In-Reply-To: <1450193743-4409-1-git-send-email-namhyung@kernel.org>
Each tracepoint event has format string for print to improve
readability. Try to parse the output and match the field name. If it
finds one, use that for the result. If not, fallbacks to the original
output.
For example, sort on kmem:kmalloc.gfp_flags looks like below:
(Note: libtraceevent plugins are not installed on my system. They might
affect the output below)
Before:
# Overhead Command gfp_flags
# ........ ....... ..........
#
99.89% perf 32848
0.06% sleep 208
0.03% perf 32976
0.01% perf 208
After:
# Overhead Command gfp_flags
# ........ ....... ...................
#
99.89% perf GFP_NOFS|GFP_ZERO
0.06% sleep GFP_KERNEL
0.03% perf GFP_KERNEL|GFP_ZERO
0.01% perf GFP_KERNEL
Cc: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/util/sort.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++--
tools/perf/util/sort.h | 1 +
2 files changed, 74 insertions(+), 2 deletions(-)
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index f2bac1c149a9..746b1c405db2 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -1560,6 +1560,47 @@ static int hde_width(struct hpp_dynamic_entry *hde)
return hde->hpp.len;
}
+static void update_dynamic_len(struct hpp_dynamic_entry *hde,
+ struct hist_entry *he)
+{
+ char *str, *pos;
+ struct trace_seq seq;
+ struct format_field *field = hde->field;
+ struct pevent_record rec = {
+ .cpu = he->cpu,
+ .data = he->raw_data,
+ .size = he->raw_size,
+ };
+ size_t namelen;
+
+ if (he->dynlen_updated)
+ return;
+
+ /* parse pretty print result and update max length */
+ trace_seq_init(&seq);
+ pevent_event_info(&seq, field->event, &rec);
+
+ namelen = strlen(field->name);
+ str = strtok_r(seq.buffer, " ", &pos);
+ while (str) {
+ if (!strncmp(str, field->name, namelen)) {
+ size_t len;
+
+ str += namelen + 1;
+ len = strlen(str);
+
+ if (len > hde->dynamic_len)
+ hde->dynamic_len = len;
+ break;
+ }
+
+ str = strtok_r(NULL, " ", &pos);
+ }
+ trace_seq_destroy(&seq);
+
+ he->dynlen_updated = true;
+}
+
static int __sort__hde_header(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
struct perf_evsel *evsel __maybe_unused)
{
@@ -1595,6 +1636,14 @@ static int __sort__hde_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
struct hpp_dynamic_entry *hde;
size_t len = fmt->user_len;
struct trace_seq seq;
+ char *str, *pos;
+ struct format_field *field;
+ struct pevent_record rec = {
+ .cpu = he->cpu,
+ .data = he->raw_data,
+ .size = he->raw_size,
+ };
+ size_t namelen;
int ret;
hde = container_of(fmt, struct hpp_dynamic_entry, hpp);
@@ -1605,9 +1654,28 @@ static int __sort__hde_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
if (hists_to_evsel(he->hists) != hde->evsel)
return scnprintf(hpp->buf, hpp->size, "%*.*s", len, len, "N/A");
+ field = hde->field;
trace_seq_init(&seq);
- print_event_field(&seq, he->raw_data, hde->field);
- ret = scnprintf(hpp->buf, hpp->size, "%*.*s", len, len, seq.buffer);
+ pevent_event_info(&seq, field->event, &rec);
+
+ namelen = strlen(field->name);
+ str = strtok_r(seq.buffer, " ", &pos);
+ while (str) {
+ if (!strncmp(str, field->name, namelen)) {
+ str += namelen + 1;
+ break;
+ }
+
+ str = strtok_r(NULL, " ", &pos);
+ }
+
+ if (str == NULL) {
+ trace_seq_reset(&seq);
+ print_event_field(&seq, he->raw_data, hde->field);
+ str = seq.buffer;
+ }
+
+ ret = scnprintf(hpp->buf, hpp->size, "%*.*s", len, len, str);
trace_seq_destroy(&seq);
return ret;
}
@@ -1638,6 +1706,9 @@ static int64_t __sort__hde_cmp(struct perf_hpp_fmt *fmt,
} else {
offset = field->offset;
size = field->size;
+
+ update_dynamic_len(hde, a);
+ update_dynamic_len(hde, b);
}
return memcmp(a->raw_data + offset, b->raw_data + offset, size);
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index dd1c2973a836..aefcc2f8f173 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -97,6 +97,7 @@ struct hist_entry {
/* We are added by hists__add_dummy_entry. */
bool dummy;
+ bool dynlen_updated;
char level;
u8 filtered;
--
2.6.4
next prev parent reply other threads:[~2015-12-15 15:36 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-15 15:35 [PATCHSET 00/10] perf tools: Support dynamic sort keys for tracepoints (v2) Namhyung Kim
2015-12-15 15:35 ` [PATCH 01/10] perf hist: Pass struct sample to __hists__add_entry() Namhyung Kim
2015-12-15 15:35 ` [PATCH 02/10] perf hist: Save raw_data/size for tracepoint events Namhyung Kim
2015-12-17 8:14 ` [PATCH v2.1] " Namhyung Kim
2015-12-17 12:22 ` Arnaldo Carvalho de Melo
2015-12-15 15:35 ` [PATCH 03/10] tools lib traceevent: Factor out and export print_event_field[s] Namhyung Kim
2015-12-15 15:35 ` [PATCH 04/10] perf tools: Pass evlist to setup_sorting() Namhyung Kim
2015-12-15 15:35 ` [PATCH 05/10] perf tools: Add dynamic sort key for tracepoint events Namhyung Kim
2015-12-20 13:51 ` Jiri Olsa
2015-12-20 14:02 ` Namhyung Kim
2015-12-15 15:35 ` Namhyung Kim [this message]
2015-12-20 14:12 ` [PATCH 06/10] perf tools: Try to show pretty printed output for dynamic sort keys Jiri Olsa
2015-12-21 8:36 ` Namhyung Kim
2015-12-15 15:35 ` [PATCH 07/10] perf tools: Add 'trace' sort key Namhyung Kim
2015-12-15 15:35 ` [PATCH 08/10] perf tools: Add --raw-trace option Namhyung Kim
2015-12-20 14:58 ` Jiri Olsa
2015-12-21 8:44 ` Namhyung Kim
2015-12-22 6:57 ` Jiri Olsa
2015-12-22 16:19 ` Namhyung Kim
2015-12-15 15:35 ` [PATCH 09/10] perf tools: Make 'trace' sort key default for tracepoint events Namhyung Kim
2015-12-15 15:35 ` [PATCH 10/10] perf tools: Support shortcuts for events in dynamic sort keys Namhyung Kim
2015-12-17 0:17 ` [PATCHSET 00/10] perf tools: Support dynamic sort keys for tracepoints (v2) Arnaldo Carvalho de Melo
2015-12-17 7:56 ` Namhyung Kim
2015-12-17 12:21 ` Arnaldo Carvalho de Melo
-- strict thread matches above, loose matches on Subject: below --
2015-12-21 14:26 [PATCHSET 00/10] perf tools: Support dynamic sort keys for tracepoints (v3) Namhyung Kim
2015-12-21 14:26 ` [PATCH 06/10] perf tools: Try to show pretty printed output for dynamic sort keys Namhyung Kim
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=1450193743-4409-7-git-send-email-namhyung@kernel.org \
--to=namhyung@kernel.org \
--cc=acme@kernel.org \
--cc=andi@firstfloor.org \
--cc=dsahern@gmail.com \
--cc=fweisbec@gmail.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=wangnan0@huawei.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox