Re: [tip:perf/urgent] perf hists: Fix determination of a callchain node's childlessness

From: Andres Freund
Date: Mon Apr 18 2016 - 10:25:34 EST


Hi,

Perhaps the patch quoted below should also go into stable? It'd be nice
to fix that regression for 4.4 and 4.5. It's been integrated into 4.6
(909890355).

Regards,

Andres

On 2016-03-30 23:33:37 -0700, tip-bot for Andres Freund wrote:
> Commit-ID: 909890355507e92bdaf648e73870f6b5df606da8
> Gitweb: http://git.kernel.org/tip/909890355507e92bdaf648e73870f6b5df606da8
> Author: Andres Freund <andres@xxxxxxxxxxx>
> AuthorDate: Wed, 30 Mar 2016 21:02:45 +0200
> Committer: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
> CommitDate: Wed, 30 Mar 2016 18:08:39 -0300
>
> perf hists: Fix determination of a callchain node's childlessness
>
> The 4b3a3212233a ("perf hists browser: Support flat callchains") commit
> over-aggressively tried to optimize callchain_node__init_have_children().
>
> That lead to --tui mode not allowing to expand call chain elements if a
> call chain element had only one parent. That's why --inverted callgraphs
> looked halfway sane, but plain ones didn't.
>
> Revert that individual optimization, it wasn't really related to the
> rest of the commit.
>
> Signed-off-by: Andres Freund <andres@xxxxxxxxxxx>
> Acked-by: Namhyung Kim <namhyung@xxxxxxxxxx>
> Tested-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
> Cc: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx>
> Fixes: 4b3a3212233a ("perf hists browser: Support flat callchains")
> Link: http://lkml.kernel.org/r/20160330190245.GB13305@xxxxxxxxxxxxxxxxxx
> Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
> ---
> tools/perf/ui/browsers/hists.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
> index 4b98165..2a83414 100644
> --- a/tools/perf/ui/browsers/hists.c
> +++ b/tools/perf/ui/browsers/hists.c
> @@ -337,7 +337,7 @@ static void callchain_node__init_have_children(struct callchain_node *node,
> chain = list_entry(node->val.next, struct callchain_list, list);
> chain->has_children = has_sibling;
>
> - if (node->val.next != node->val.prev) {
> + if (!list_empty(&node->val)) {
> chain = list_entry(node->val.prev, struct callchain_list, list);
> chain->has_children = !RB_EMPTY_ROOT(&node->rb_root);
> }