perf tools: Add 'trace' sort key
The 'trace' sort key is to show tracepoint event output using either
print fmt or plugin. For example sched_switch event (using plugin) will
show output like below:
# perf record -e sched:sched_switch -a usleep 10
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.197 MB perf.data (69 samples) ]
#
$ perf report -s trace --stdio
...
# Overhead Trace output
# ........ ...................................................
#
9.48% swapper/0:0 [120] R ==> transmission-gt:17773 [120]
9.48% transmission-gt:17773 [120] S ==> swapper/0:0 [120]
9.04% swapper/2:0 [120] R ==> transmission-gt:17773 [120]
8.92% transmission-gt:17773 [120] S ==> swapper/2:0 [120]
5.25% swapper/0:0 [120] R ==> kworker/0:1H:109 [100]
5.21% kworker/0:1H:109 [100] S ==> swapper/0:0 [120]
1.78% swapper/3:0 [120] R ==> transmission-gt:17773 [120]
1.78% transmission-gt:17773 [120] S ==> swapper/3:0 [120]
1.53% Xephyr:6524 [120] S ==> swapper/0:0 [120]
1.53% swapper/0:0 [120] R ==> Xephyr:6524 [120]
1.17% swapper/2:0 [120] R ==> irq/33-iwlwifi:233 [49]
1.13% irq/33-iwlwifi:233 [49] S ==> swapper/2:0 [120]
Note that the 'trace' sort key works only for tracepoint events. If
it's used to other type of events, just "N/A" will be printed.
Suggested-and-acked-by: Jiri Olsa <jolsa@redhat.com>
Signed-off-by: Namhyung Kim <namhyung@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: Jiri Olsa <jolsa@redhat.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-8-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
60517d28fb
commit
a34bb6a08d
@@ -52,6 +52,7 @@ enum hist_column {
|
|||||||
HISTC_MEM_IADDR_SYMBOL,
|
HISTC_MEM_IADDR_SYMBOL,
|
||||||
HISTC_TRANSACTION,
|
HISTC_TRANSACTION,
|
||||||
HISTC_CYCLES,
|
HISTC_CYCLES,
|
||||||
|
HISTC_TRACE,
|
||||||
HISTC_NR_COLS, /* Last entry */
|
HISTC_NR_COLS, /* Last entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -445,6 +445,65 @@ struct sort_entry sort_socket = {
|
|||||||
.se_width_idx = HISTC_SOCKET,
|
.se_width_idx = HISTC_SOCKET,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* --sort trace */
|
||||||
|
|
||||||
|
static char *get_trace_output(struct hist_entry *he)
|
||||||
|
{
|
||||||
|
struct trace_seq seq;
|
||||||
|
struct perf_evsel *evsel;
|
||||||
|
struct pevent_record rec = {
|
||||||
|
.data = he->raw_data,
|
||||||
|
.size = he->raw_size,
|
||||||
|
};
|
||||||
|
|
||||||
|
evsel = hists_to_evsel(he->hists);
|
||||||
|
|
||||||
|
trace_seq_init(&seq);
|
||||||
|
pevent_event_info(&seq, evsel->tp_format, &rec);
|
||||||
|
return seq.buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64_t
|
||||||
|
sort__trace_cmp(struct hist_entry *left, struct hist_entry *right)
|
||||||
|
{
|
||||||
|
struct perf_evsel *evsel;
|
||||||
|
|
||||||
|
evsel = hists_to_evsel(left->hists);
|
||||||
|
if (evsel->attr.type != PERF_TYPE_TRACEPOINT)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (left->trace_output == NULL)
|
||||||
|
left->trace_output = get_trace_output(left);
|
||||||
|
if (right->trace_output == NULL)
|
||||||
|
right->trace_output = get_trace_output(right);
|
||||||
|
|
||||||
|
hists__new_col_len(left->hists, HISTC_TRACE, strlen(left->trace_output));
|
||||||
|
hists__new_col_len(right->hists, HISTC_TRACE, strlen(right->trace_output));
|
||||||
|
|
||||||
|
return strcmp(right->trace_output, left->trace_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int hist_entry__trace_snprintf(struct hist_entry *he, char *bf,
|
||||||
|
size_t size, unsigned int width)
|
||||||
|
{
|
||||||
|
struct perf_evsel *evsel;
|
||||||
|
|
||||||
|
evsel = hists_to_evsel(he->hists);
|
||||||
|
if (evsel->attr.type != PERF_TYPE_TRACEPOINT)
|
||||||
|
return scnprintf(bf, size, "%-*.*s", width, width, "N/A");
|
||||||
|
|
||||||
|
if (he->trace_output == NULL)
|
||||||
|
he->trace_output = get_trace_output(he);
|
||||||
|
return repsep_snprintf(bf, size, "%-*.*s", width, width, he->trace_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct sort_entry sort_trace = {
|
||||||
|
.se_header = "Trace output",
|
||||||
|
.se_cmp = sort__trace_cmp,
|
||||||
|
.se_snprintf = hist_entry__trace_snprintf,
|
||||||
|
.se_width_idx = HISTC_TRACE,
|
||||||
|
};
|
||||||
|
|
||||||
/* sort keys for branch stacks */
|
/* sort keys for branch stacks */
|
||||||
|
|
||||||
static int64_t
|
static int64_t
|
||||||
@@ -1314,6 +1373,7 @@ static struct sort_dimension common_sort_dimensions[] = {
|
|||||||
DIM(SORT_LOCAL_WEIGHT, "local_weight", sort_local_weight),
|
DIM(SORT_LOCAL_WEIGHT, "local_weight", sort_local_weight),
|
||||||
DIM(SORT_GLOBAL_WEIGHT, "weight", sort_global_weight),
|
DIM(SORT_GLOBAL_WEIGHT, "weight", sort_global_weight),
|
||||||
DIM(SORT_TRANSACTION, "transaction", sort_transaction),
|
DIM(SORT_TRANSACTION, "transaction", sort_transaction),
|
||||||
|
DIM(SORT_TRACE, "trace", sort_trace),
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef DIM
|
#undef DIM
|
||||||
@@ -1560,22 +1620,6 @@ static int hde_width(struct hpp_dynamic_entry *hde)
|
|||||||
return hde->hpp.len;
|
return hde->hpp.len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *get_trace_output(struct hist_entry *he)
|
|
||||||
{
|
|
||||||
struct trace_seq seq;
|
|
||||||
struct perf_evsel *evsel;
|
|
||||||
struct pevent_record rec = {
|
|
||||||
.data = he->raw_data,
|
|
||||||
.size = he->raw_size,
|
|
||||||
};
|
|
||||||
|
|
||||||
evsel = hists_to_evsel(he->hists);
|
|
||||||
|
|
||||||
trace_seq_init(&seq);
|
|
||||||
pevent_event_info(&seq, evsel->tp_format, &rec);
|
|
||||||
return seq.buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void update_dynamic_len(struct hpp_dynamic_entry *hde,
|
static void update_dynamic_len(struct hpp_dynamic_entry *hde,
|
||||||
struct hist_entry *he)
|
struct hist_entry *he)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -183,6 +183,7 @@ enum sort_type {
|
|||||||
SORT_LOCAL_WEIGHT,
|
SORT_LOCAL_WEIGHT,
|
||||||
SORT_GLOBAL_WEIGHT,
|
SORT_GLOBAL_WEIGHT,
|
||||||
SORT_TRANSACTION,
|
SORT_TRANSACTION,
|
||||||
|
SORT_TRACE,
|
||||||
|
|
||||||
/* branch stack specific sort keys */
|
/* branch stack specific sort keys */
|
||||||
__SORT_BRANCH_STACK,
|
__SORT_BRANCH_STACK,
|
||||||
|
|||||||
Reference in New Issue
Block a user