Messages in this thread | | | Date | Mon, 23 Nov 2015 16:16:48 +0100 | From | Frederic Weisbecker <> | Subject | Re: [PATCH 34/37] perf hists browser: Support flat callchains |
| |
On Thu, Nov 19, 2015 at 02:53:20PM -0300, Arnaldo Carvalho de Melo wrote: > From: Namhyung Kim <namhyung@kernel.org> > > The flat callchain mode is to print all chains in a single, simple > hierarchy so make it easy to see. > > Currently perf report --tui doesn't show flat callchains properly. With > flat callchains, only leaf nodes are added to the final rbtree so it > should show entries in parent nodes. To do that, add parent_val list to > struct callchain_node and show them along with the (normal) val list. > > For example, consider following callchains with '-g graph'. > > $ perf report -g graph > - 39.93% swapper [kernel.vmlinux] [k] intel_idle > intel_idle > cpuidle_enter_state > cpuidle_enter > call_cpuidle > - cpu_startup_entry > 28.63% start_secondary > - 11.30% rest_init > start_kernel > x86_64_start_reservations > x86_64_start_kernel > > Before: > $ perf report -g flat > - 39.93% swapper [kernel.vmlinux] [k] intel_idle > 28.63% start_secondary > - 11.30% rest_init > start_kernel > x86_64_start_reservations > x86_64_start_kernel > > After: > $ perf report -g flat > - 39.93% swapper [kernel.vmlinux] [k] intel_idle > - 28.63% intel_idle > cpuidle_enter_state > cpuidle_enter > call_cpuidle > cpu_startup_entry > start_secondary > - 11.30% intel_idle > cpuidle_enter_state > cpuidle_enter > call_cpuidle > cpu_startup_entry > start_kernel > x86_64_start_reservations > x86_64_start_kernel > > Signed-off-by: Namhyung Kim <namhyung@kernel.org> > Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> > Tested-by: Brendan Gregg <brendan.d.gregg@gmail.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: Kan Liang <kan.liang@intel.com> > Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> > Link: http://lkml.kernel.org/r/1447047946-1691-8-git-send-email-namhyung@kernel.org > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> > ---
[...]
> +int callchain_node__make_parent_list(struct callchain_node *node) > +{ > + struct callchain_node *parent = node->parent; > + struct callchain_list *chain, *new; > + LIST_HEAD(head); > + > + while (parent) { > + list_for_each_entry_reverse(chain, &parent->val, list) { > + new = malloc(sizeof(*new)); > + if (new == NULL) > + goto out; > + *new = *chain; > + new->has_children = false; > + list_add_tail(&new->list, &head); > + } > + parent = parent->parent; > + } > + > + list_for_each_entry_safe_reverse(chain, new, &head, list) > + list_move_tail(&chain->list, &node->parent_val); > + > + if (!list_empty(&node->parent_val)) { > + chain = list_first_entry(&node->parent_val, struct callchain_list, list); > + chain->has_children = rb_prev(&node->rb_node) || rb_next(&node->rb_node); > + > + chain = list_first_entry(&node->val, struct callchain_list, list); > + chain->has_children = false;
I'm a bit puzzled with this, can't we rewind through the parents on printing or adding to the flat rbtree instead of having this parent_val field?
Thanks.
| |