perf tools: Add 'trace_fields' dynamic sort key
The 'trace_fields' sort key is similar as 'trace' sort key, but it shows each fields separately. Each event will get different columns as their fields. $ perf report -s trace_fields --stdio # To display the perf.data header info, please use --header/--header-only options. # # # Total Lost Samples: 0 # # Samples: 20K of event 'kmem:kmalloc' # Event count (approx.): 20533 # # Overhead Command call_site ptr bytes_req bytes_alloc gfp_flags # ........ ....... .................. .................. ......... ........... ................... # 99.89% perf ffffffffa01d4396 0xffff8803ffb79720 96 96 GFP_NOFS|GFP_ZERO 0.06% sleep ffffffff8114e1cd 0xffff8803d228a000 4096 4096 GFP_KERNEL 0.03% perf ffffffff811d6ae6 0xffff8803f7678f00 240 256 GFP_KERNEL|GFP_ZERO 0.00% perf ffffffff812263c1 0xffff880406172380 128 128 GFP_KERNEL 0.00% perf ffffffff812264b9 0xffff8803ffac1600 504 512 GFP_KERNEL 0.00% perf ffffffff81226634 0xffff880401dc5280 28 32 GFP_KERNEL 0.00% sleep ffffffff81226da9 0xffff8803ffac3a00 392 512 GFP_KERNEL # Samples: 20K of event 'kmem:kfree' # Event count (approx.): 20597 # # Overhead call_site ptr # ........ .................. .................. # 99.58% ffffffffa01d85ad 0xffff8803ffb79720 0.07% ffffffff81443f5c 0xffff8803f7669400 0.02% ffffffff811d5753 0xffff8803f7678f00 0.01% ffffffff81443f5c 0xffff8803f766be00 0.01% ffffffff8114e359 0xffff8803d228a000 0.01% ffffffff81443f5c 0xffff8800d156dc00 0.01% ffffffff81443f5c 0xffff8803f7669400 0.01% ffffffff8114e359 0xffff8803d228a000 0.01% ffffffff8114e359 0xffff8803d228a000 0.01% ffffffff8114e359 0xffff8803d228a000 Signed-off-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Jiri Olsa <jolsa@kernel.org> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Andi Kleen <andi@firstfloor.org> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/r/1450804030-29193-13-git-send-email-namhyung@kernel.org [ Combined with "perf tools: Fix segfault when using -s trace_fields" ] Link: http://lkml.kernel.org/r/1451991518-25673-1-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
361459f163
commit
2e422fd1e4
|
@ -1932,6 +1932,38 @@ static int __dynamic_dimension__add(struct perf_evsel *evsel,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int add_evsel_fields(struct perf_evsel *evsel, bool raw_trace)
|
||||
{
|
||||
int ret;
|
||||
struct format_field *field;
|
||||
|
||||
field = evsel->tp_format->format.fields;
|
||||
while (field) {
|
||||
ret = __dynamic_dimension__add(evsel, field, raw_trace);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
field = field->next;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int add_all_dynamic_fields(struct perf_evlist *evlist, bool raw_trace)
|
||||
{
|
||||
int ret;
|
||||
struct perf_evsel *evsel;
|
||||
|
||||
evlist__for_each(evlist, evsel) {
|
||||
if (evsel->attr.type != PERF_TYPE_TRACEPOINT)
|
||||
continue;
|
||||
|
||||
ret = add_evsel_fields(evsel, raw_trace);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok)
|
||||
{
|
||||
char *str, *event_name, *field_name, *opt_name;
|
||||
|
@ -1961,6 +1993,11 @@ static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok)
|
|||
raw_trace = true;
|
||||
}
|
||||
|
||||
if (!strcmp(field_name, "trace_fields")) {
|
||||
ret = add_all_dynamic_fields(evlist, raw_trace);
|
||||
goto out;
|
||||
}
|
||||
|
||||
evsel = find_evsel(evlist, event_name);
|
||||
if (evsel == NULL) {
|
||||
pr_debug("Cannot find event: %s\n", event_name);
|
||||
|
@ -1975,15 +2012,7 @@ static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok)
|
|||
}
|
||||
|
||||
if (!strcmp(field_name, "*")) {
|
||||
field = evsel->tp_format->format.fields;
|
||||
|
||||
while (field) {
|
||||
ret = __dynamic_dimension__add(evsel, field, raw_trace);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
field = field->next;
|
||||
}
|
||||
ret = add_evsel_fields(evsel, raw_trace);
|
||||
} else {
|
||||
field = pevent_find_any_field(evsel->tp_format, field_name);
|
||||
if (field == NULL) {
|
||||
|
|
Loading…
Reference in a new issue