perf tools: Make 'trace' or 'trace_fields' sort key default for tracepoint events - kernel/git/torvalds/linux.git (original) (raw)

perf tools: Make 'trace' or 'trace_fields' sort key default for tracepoint events

When an evlist contains tracepoint events only, use 'trace' sort key as default. If --raw-trace option was given, use 'trace_fields' instead. This will make users more convenient to see trace result. Suggested-and-Acked-by: Jiri Olsa jolsa@kernel.org 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: 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-14-git-send-email-namhyung@kernel.org[ Check evlist in get_default_sort_order() fixing a segfault in 'perf test hists' reported by Jiri Olsa ] Signed-off-by: Arnaldo Carvalho de Melo acme@redhat.com

@@ -15,6 +15,7 @@ const char default_branch_sort_order[] = "comm,dso_from,symbol_from,symbol_to,cy

const char default_mem_sort_order[] = "local_weight,mem,sym,dso,symbol_daddr,dso_daddr,snoop,tlb,locked";

const char default_top_sort_order[] = "dso,symbol";

const char default_diff_sort_order[] = "dso,symbol";

+const char default_tracepoint_sort_order[] = "trace";

const char *sort_order;

const char *field_order;

regex_t ignore_callees_regex;

@@ -2171,7 +2172,7 @@ static int sort_dimension__add(const char *tok,

return -ESRCH;

}

-static const char *get_default_sort_order(void)

+static const char *get_default_sort_order(struct perf_evlist *evlist)

{

const char *default_sort_orders[] = {

default_sort_order,

@@ -2179,14 +2180,33 @@ static const char *get_default_sort_order(void)

default_mem_sort_order,

default_top_sort_order,

default_diff_sort_order,

+ default_tracepoint_sort_order,

};

+ bool use_trace = true;

+ struct perf_evsel *evsel;

BUG_ON(sort__mode >= ARRAY_SIZE(default_sort_orders));

+ if (evlist == NULL)

+ goto out_no_evlist;

+ evlist__for_each(evlist, evsel) {

+ if (evsel->attr.type != PERF_TYPE_TRACEPOINT) {

+ use_trace = false;

+ break;

+ }

+ }

+ if (use_trace) {

+ sort__mode = SORT_MODE__TRACEPOINT;

+ if (symbol_conf.raw_trace)

+ return "trace_fields";

+ }

+out_no_evlist:

return default_sort_orders[sort__mode];

}

-static int setup_sort_order(void)

+static int setup_sort_order(struct perf_evlist *evlist)

{

char *new_sort_order;

@@ -2207,7 +2227,7 @@ static int setup_sort_order(void)

* because it's checked over the rest of the code.

*/

if (asprintf(&new_sort_order, "%s,%s",

- get_default_sort_order(), sort_order + 1) < 0) {

+ get_default_sort_order(evlist), sort_order + 1) < 0) {

error("Not enough memory to set up --sort");

return -ENOMEM;

}

@@ -2222,7 +2242,7 @@ static int __setup_sorting(struct perf_evlist *evlist)

const char *sort_keys;

int ret = 0;

- ret = setup_sort_order();

+ ret = setup_sort_order(evlist);

if (ret)

return ret;

@@ -2236,7 +2256,7 @@ static int __setup_sorting(struct perf_evlist *evlist)

return 0;

}

- sort_keys = get_default_sort_order();

+ sort_keys = get_default_sort_order(evlist);

}

str = strdup(sort_keys);

@@ -167,6 +167,7 @@ enum sort_mode {

SORT_MODE__MEMORY,

SORT_MODE__TOP,

SORT_MODE__DIFF,

+ SORT_MODE__TRACEPOINT,

};

enum sort_type {