From 053a3989e12fdf3be45c00ec1cb0ce09fba0ee4a Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Wed, 23 Dec 2015 02:07:05 +0900 Subject: perf report/top: Add --raw-trace option The --raw-trace option allows disabling pretty printing by the event's print_fmt or plugin. Besides that, each dynamic sort key now can receive a 'raw' suffix separated by '/' to ask for the raw trace of 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-and-Acked-by: Jiri Olsa Signed-off-by: Namhyung Kim Tested-by: Arnaldo Carvalho de Melo Cc: Andi Kleen Cc: David Ahern Cc: Frederic Weisbecker Cc: Jiri Olsa Cc: Peter Zijlstra Cc: Steven Rostedt Cc: Wang Nan Link: http://lkml.kernel.org/r/1450804030-29193-9-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/sort.c | 32 +++++++++++++++++++++++++++++--- tools/perf/util/symbol.h | 3 ++- 2 files changed, 31 insertions(+), 4 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index db8476a9b103..34776854626e 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -459,7 +459,12 @@ 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) { + pevent_print_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 +1601,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 +1634,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 +1717,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 +1749,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); pevent_print_field(&seq, he->raw_data, hde->field); str = seq.buffer; @@ -1818,10 +1830,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 +1852,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 +1897,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, -- cgit v1.2.1