perf hists: Fix children sort key behavior

When perf report --children resorts output fields, it tries to put
caller above the callee.  But this was only meaningful for a same thread
and doing this requires callchain enabled.  So fix its check before
comparing the callchain depth.

This also changes the hist accumulation tests: In test 3, xmalloc in
bash thread should be above than other perf threads due to alphabetical
order of comm string.  Also it's under page_fault in bash thread since
alphabetical order of dso name.  The sys_perf_event_open in perf thread
is put on the last line since it's self overhead is 0.

In test 4, the sys_perf_event_open is put above other perf entries that
have same children overhead since its callchain depth is smaller.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1419309381-2593-1-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Namhyung Kim 2014-12-23 13:36:21 +09:00 committed by Arnaldo Carvalho de Melo
parent ed9eb845d7
commit 5ca8271022
2 changed files with 36 additions and 33 deletions

View File

@ -454,12 +454,12 @@ static int test3(struct perf_evsel *evsel, struct machine *machine)
* 30.00% 10.00% perf perf [.] cmd_record * 30.00% 10.00% perf perf [.] cmd_record
* 20.00% 0.00% bash libc [.] malloc * 20.00% 0.00% bash libc [.] malloc
* 10.00% 10.00% bash [kernel] [k] page_fault * 10.00% 10.00% bash [kernel] [k] page_fault
* 10.00% 10.00% perf [kernel] [k] schedule
* 10.00% 0.00% perf [kernel] [k] sys_perf_event_open
* 10.00% 10.00% perf [kernel] [k] page_fault
* 10.00% 10.00% perf libc [.] free
* 10.00% 10.00% perf libc [.] malloc
* 10.00% 10.00% bash bash [.] xmalloc * 10.00% 10.00% bash bash [.] xmalloc
* 10.00% 10.00% perf [kernel] [k] page_fault
* 10.00% 10.00% perf libc [.] malloc
* 10.00% 10.00% perf [kernel] [k] schedule
* 10.00% 10.00% perf libc [.] free
* 10.00% 0.00% perf [kernel] [k] sys_perf_event_open
*/ */
struct result expected[] = { struct result expected[] = {
{ 7000, 2000, "perf", "perf", "main" }, { 7000, 2000, "perf", "perf", "main" },
@ -468,12 +468,12 @@ static int test3(struct perf_evsel *evsel, struct machine *machine)
{ 3000, 1000, "perf", "perf", "cmd_record" }, { 3000, 1000, "perf", "perf", "cmd_record" },
{ 2000, 0, "bash", "libc", "malloc" }, { 2000, 0, "bash", "libc", "malloc" },
{ 1000, 1000, "bash", "[kernel]", "page_fault" }, { 1000, 1000, "bash", "[kernel]", "page_fault" },
{ 1000, 1000, "perf", "[kernel]", "schedule" }, { 1000, 1000, "bash", "bash", "xmalloc" },
{ 1000, 0, "perf", "[kernel]", "sys_perf_event_open" },
{ 1000, 1000, "perf", "[kernel]", "page_fault" }, { 1000, 1000, "perf", "[kernel]", "page_fault" },
{ 1000, 1000, "perf", "[kernel]", "schedule" },
{ 1000, 1000, "perf", "libc", "free" }, { 1000, 1000, "perf", "libc", "free" },
{ 1000, 1000, "perf", "libc", "malloc" }, { 1000, 1000, "perf", "libc", "malloc" },
{ 1000, 1000, "bash", "bash", "xmalloc" }, { 1000, 0, "perf", "[kernel]", "sys_perf_event_open" },
}; };
symbol_conf.use_callchain = false; symbol_conf.use_callchain = false;
@ -537,10 +537,13 @@ static int test4(struct perf_evsel *evsel, struct machine *machine)
* malloc * malloc
* main * main
* *
* 10.00% 10.00% perf [kernel] [k] schedule * 10.00% 10.00% bash bash [.] xmalloc
* | * |
* --- schedule * --- xmalloc
* run_command * malloc
* xmalloc <--- NOTE: there's a cycle
* malloc
* xmalloc
* main * main
* *
* 10.00% 0.00% perf [kernel] [k] sys_perf_event_open * 10.00% 0.00% perf [kernel] [k] sys_perf_event_open
@ -556,6 +559,12 @@ static int test4(struct perf_evsel *evsel, struct machine *machine)
* run_command * run_command
* main * main
* *
* 10.00% 10.00% perf [kernel] [k] schedule
* |
* --- schedule
* run_command
* main
*
* 10.00% 10.00% perf libc [.] free * 10.00% 10.00% perf libc [.] free
* | * |
* --- free * --- free
@ -570,15 +579,6 @@ static int test4(struct perf_evsel *evsel, struct machine *machine)
* run_command * run_command
* main * main
* *
* 10.00% 10.00% bash bash [.] xmalloc
* |
* --- xmalloc
* malloc
* xmalloc <--- NOTE: there's a cycle
* malloc
* xmalloc
* main
*
*/ */
struct result expected[] = { struct result expected[] = {
{ 7000, 2000, "perf", "perf", "main" }, { 7000, 2000, "perf", "perf", "main" },
@ -587,12 +587,12 @@ static int test4(struct perf_evsel *evsel, struct machine *machine)
{ 3000, 1000, "perf", "perf", "cmd_record" }, { 3000, 1000, "perf", "perf", "cmd_record" },
{ 2000, 0, "bash", "libc", "malloc" }, { 2000, 0, "bash", "libc", "malloc" },
{ 1000, 1000, "bash", "[kernel]", "page_fault" }, { 1000, 1000, "bash", "[kernel]", "page_fault" },
{ 1000, 1000, "perf", "[kernel]", "schedule" }, { 1000, 1000, "bash", "bash", "xmalloc" },
{ 1000, 0, "perf", "[kernel]", "sys_perf_event_open" }, { 1000, 0, "perf", "[kernel]", "sys_perf_event_open" },
{ 1000, 1000, "perf", "[kernel]", "page_fault" }, { 1000, 1000, "perf", "[kernel]", "page_fault" },
{ 1000, 1000, "perf", "[kernel]", "schedule" },
{ 1000, 1000, "perf", "libc", "free" }, { 1000, 1000, "perf", "libc", "free" },
{ 1000, 1000, "perf", "libc", "malloc" }, { 1000, 1000, "perf", "libc", "malloc" },
{ 1000, 1000, "bash", "bash", "xmalloc" },
}; };
struct callchain_result expected_callchain[] = { struct callchain_result expected_callchain[] = {
{ {
@ -622,9 +622,12 @@ static int test4(struct perf_evsel *evsel, struct machine *machine)
{ "bash", "main" }, }, { "bash", "main" }, },
}, },
{ {
3, { { "[kernel]", "schedule" }, 6, { { "bash", "xmalloc" },
{ "perf", "run_command" }, { "libc", "malloc" },
{ "perf", "main" }, }, { "bash", "xmalloc" },
{ "libc", "malloc" },
{ "bash", "xmalloc" },
{ "bash", "main" }, },
}, },
{ {
3, { { "[kernel]", "sys_perf_event_open" }, 3, { { "[kernel]", "sys_perf_event_open" },
@ -637,6 +640,11 @@ static int test4(struct perf_evsel *evsel, struct machine *machine)
{ "perf", "run_command" }, { "perf", "run_command" },
{ "perf", "main" }, }, { "perf", "main" }, },
}, },
{
3, { { "[kernel]", "schedule" },
{ "perf", "run_command" },
{ "perf", "main" }, },
},
{ {
4, { { "libc", "free" }, 4, { { "libc", "free" },
{ "perf", "cmd_record" }, { "perf", "cmd_record" },
@ -649,14 +657,6 @@ static int test4(struct perf_evsel *evsel, struct machine *machine)
{ "perf", "run_command" }, { "perf", "run_command" },
{ "perf", "main" }, }, { "perf", "main" }, },
}, },
{
6, { { "bash", "xmalloc" },
{ "libc", "malloc" },
{ "bash", "xmalloc" },
{ "libc", "malloc" },
{ "bash", "xmalloc" },
{ "bash", "main" }, },
},
}; };
symbol_conf.use_callchain = true; symbol_conf.use_callchain = true;

View File

@ -204,6 +204,9 @@ static int __hpp__sort_acc(struct hist_entry *a, struct hist_entry *b,
if (ret) if (ret)
return ret; return ret;
if (a->thread != b->thread || !symbol_conf.use_callchain)
return 0;
ret = b->callchain->max_depth - a->callchain->max_depth; ret = b->callchain->max_depth - a->callchain->max_depth;
} }
return ret; return ret;