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:
parent
ed9eb845d7
commit
5ca8271022
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue