Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752627AbbLVRKD (ORCPT ); Tue, 22 Dec 2015 12:10:03 -0500 Received: from mail-pf0-f180.google.com ([209.85.192.180]:35535 "EHLO mail-pf0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755511AbbLVRIY (ORCPT ); Tue, 22 Dec 2015 12:08:24 -0500 From: Namhyung Kim To: Arnaldo Carvalho de Melo Cc: Ingo Molnar , Peter Zijlstra , Jiri Olsa , LKML , David Ahern , Steven Rostedt , Frederic Weisbecker , Andi Kleen , Wang Nan Subject: [PATCH 08/13] perf tools: Add --raw-trace option Date: Wed, 23 Dec 2015 02:07:05 +0900 Message-Id: <1450804030-29193-9-git-send-email-namhyung@kernel.org> X-Mailer: git-send-email 2.6.4 In-Reply-To: <1450804030-29193-1-git-send-email-namhyung@kernel.org> References: <1450804030-29193-1-git-send-email-namhyung@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 7109 Lines: 212 The --raw-trace option is to prevent pretty printing by event's print_fmt or plugin. Besides that, each dynamic sort key now receives 'raw' suffix separated by '/' to apply the raw trace to a specific field. $ perf report -s comm,kmem:kmalloc.gfp_flags ... # 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 Now $ perf report -s comm,kmem:kmalloc.gfp_flags --raw-trace or $ perf report -s comm,kmem:kmalloc.gfp_flags/raw ... # Overhead Command gfp_flags # ........ ....... .......... # 99.89% perf 32848 0.06% sleep 208 0.03% perf 32976 0.01% perf 208 Suggested-by: Jiri Olsa Cc: Steven Rostedt Signed-off-by: Namhyung Kim --- tools/perf/Documentation/perf-report.txt | 3 +++ tools/perf/Documentation/perf-top.txt | 3 +++ tools/perf/builtin-report.c | 2 ++ tools/perf/builtin-top.c | 2 ++ tools/perf/util/sort.c | 31 ++++++++++++++++++++++++++++--- tools/perf/util/symbol.h | 3 ++- 6 files changed, 40 insertions(+), 4 deletions(-) diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt index dab99ed2b339..ae7cd91727f6 100644 --- a/tools/perf/Documentation/perf-report.txt +++ b/tools/perf/Documentation/perf-report.txt @@ -371,6 +371,9 @@ include::itrace.txt[] --socket-filter:: Only report the samples on the processor socket that match with this filter +--raw-trace:: + When displaying traceevent output, do not use print fmt or plugins. + include::callchain-overhead-calculation.txt[] SEE ALSO diff --git a/tools/perf/Documentation/perf-top.txt b/tools/perf/Documentation/perf-top.txt index 556cec09bf50..b0e60e17db38 100644 --- a/tools/perf/Documentation/perf-top.txt +++ b/tools/perf/Documentation/perf-top.txt @@ -230,6 +230,9 @@ Default is to monitor all CPUS. The various filters must be specified as a comma separated list: --branch-filter any_ret,u,k Note that this feature may not be available on all processors. +--raw-trace:: + When displaying traceevent output, do not use print fmt or plugins. + INTERACTIVE PROMPTING KEYS -------------------------- diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index ea53c816640a..f10c663af996 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -788,6 +788,8 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) "Show callgraph from reference event"), OPT_INTEGER(0, "socket-filter", &report.socket_filter, "only show processor socket that match with this filter"), + OPT_BOOLEAN(0, "raw-trace", &symbol_conf.raw_trace, + "Show raw trace event output (do not use print fmt or plugins)"), OPT_END() }; struct perf_data_file file = { diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 005825942441..bf01cbb0ef23 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -1210,6 +1210,8 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused) OPT_CALLBACK('j', "branch-filter", &opts->branch_stack, "branch filter mask", "branch stack filter modes", parse_branch_stack), + OPT_BOOLEAN(0, "raw-trace", &symbol_conf.raw_trace, + "Show raw trace event output (do not use print fmt or plugins)"), OPT_END() }; const char * const top_usage[] = { diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 582f632353bc..df9e5989e209 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -459,7 +459,11 @@ static char *get_trace_output(struct hist_entry *he) evsel = hists_to_evsel(he->hists); trace_seq_init(&seq); - pevent_event_info(&seq, evsel->tp_format, &rec); + if (symbol_conf.raw_trace) + print_event_fields(&seq, he->raw_data, he->raw_size, + evsel->tp_format); + else + pevent_event_info(&seq, evsel->tp_format, &rec); return seq.buffer; } @@ -1596,6 +1600,7 @@ struct hpp_dynamic_entry { struct perf_evsel *evsel; struct format_field *field; unsigned dynamic_len; + bool raw_trace; }; static int hde_width(struct hpp_dynamic_entry *hde) @@ -1628,6 +1633,9 @@ static void update_dynamic_len(struct hpp_dynamic_entry *hde, size_t namelen; bool last = false; + if (hde->raw_trace) + return; + /* parse pretty print result and update max length */ if (!he->trace_output) he->trace_output = get_trace_output(he); @@ -1708,8 +1716,10 @@ 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; + if (hde->raw_trace) + goto raw_field; + field = hde->field; namelen = strlen(field->name); str = he->trace_output; @@ -1738,6 +1748,7 @@ static int __sort__hde_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, if (str == NULL) { struct trace_seq seq; +raw_field: trace_seq_init(&seq); print_event_field(&seq, he->raw_data, hde->field); str = seq.buffer; @@ -1818,10 +1829,11 @@ __alloc_dynamic_entry(struct perf_evsel *evsel, struct format_field *field) static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok) { - char *str, *event_name, *field_name; + char *str, *event_name, *field_name, *raw_opt; struct perf_evsel *evsel, *pos; struct format_field *field; struct hpp_dynamic_entry *hde; + bool raw_trace = symbol_conf.raw_trace; int ret = 0; if (evlist == NULL) @@ -1839,6 +1851,18 @@ static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok) } *field_name++ = '\0'; + raw_opt = strchr(field_name, '/'); + if (raw_opt) { + *raw_opt++ = '\0'; + + if (strcmp(raw_opt, "raw")) { + pr_err("Unsupported field option %s\n", raw_opt); + ret = -EINVAL; + goto out; + } + raw_trace = true; + } + evsel = NULL; evlist__for_each(evlist, pos) { if (!strcmp(pos->name, event_name)) { @@ -1872,6 +1896,7 @@ static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok) ret = -ENOMEM; goto out; } + hde->raw_trace = raw_trace; perf_hpp__register_sort_field(&hde->hpp); diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index 857f707ac12b..ccd1caa40e11 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h @@ -109,7 +109,8 @@ struct symbol_conf { branch_callstack, has_filter, show_ref_callgraph, - hide_unresolved; + hide_unresolved, + raw_trace; const char *vmlinux_name, *kallsyms_name, *source_prefix, -- 2.6.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/