From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760061AbcBYHqF (ORCPT ); Thu, 25 Feb 2016 02:46:05 -0500 Received: from torg.zytor.com ([198.137.202.12]:57774 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758399AbcBYHqC (ORCPT ); Thu, 25 Feb 2016 02:46:02 -0500 Date: Wed, 24 Feb 2016 23:44:23 -0800 From: tip-bot for Namhyung Kim Message-ID: Cc: hpa@zytor.com, wangnan0@huawei.com, namhyung@kernel.org, linux-kernel@vger.kernel.org, jolsa@kernel.org, acme@redhat.com, penberg@kernel.org, mingo@kernel.org, andi@firstfloor.org, peterz@infradead.org, dsahern@gmail.com, eranian@google.com, tglx@linutronix.de Reply-To: wangnan0@huawei.com, namhyung@kernel.org, hpa@zytor.com, andi@firstfloor.org, peterz@infradead.org, dsahern@gmail.com, eranian@google.com, tglx@linutronix.de, linux-kernel@vger.kernel.org, jolsa@kernel.org, acme@redhat.com, mingo@kernel.org, penberg@kernel.org In-Reply-To: <1456326830-30456-13-git-send-email-namhyung@kernel.org> References: <1456326830-30456-13-git-send-email-namhyung@kernel.org> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf hists browser: Support collapsing/expanding whole entries in hierarchy Git-Commit-ID: 492b1010606e9222690992ad8e4898a88a696856 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 492b1010606e9222690992ad8e4898a88a696856 Gitweb: http://git.kernel.org/tip/492b1010606e9222690992ad8e4898a88a696856 Author: Namhyung Kim AuthorDate: Thu, 25 Feb 2016 00:13:44 +0900 Committer: Arnaldo Carvalho de Melo CommitDate: Wed, 24 Feb 2016 20:21:13 -0300 perf hists browser: Support collapsing/expanding whole entries in hierarchy The 'C' and 'E' keys are to collapse/expand all hist entries. Update nr_hierarchy_entries properly in this case. Signed-off-by: Namhyung Kim Acked-by: Pekka Enberg Cc: Andi Kleen Cc: David Ahern Cc: Jiri Olsa Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Wang Nan Link: http://lkml.kernel.org/r/1456326830-30456-13-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/ui/browsers/hists.c | 58 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index de1d6f0..857b9be 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c @@ -484,13 +484,38 @@ static int callchain__set_folding(struct rb_root *chain, bool unfold) return n; } -static void hist_entry__set_folding(struct hist_entry *he, bool unfold) +static int hierarchy_set_folding(struct hist_browser *hb, struct hist_entry *he, + bool unfold __maybe_unused) +{ + float percent; + struct rb_node *nd; + struct hist_entry *child; + int n = 0; + + for (nd = rb_first(&he->hroot_out); nd; nd = rb_next(nd)) { + child = rb_entry(nd, struct hist_entry, rb_node); + percent = hist_entry__get_percent_limit(child); + if (!child->filtered && percent >= hb->min_pcnt) + n++; + } + + return n; +} + +static void hist_entry__set_folding(struct hist_entry *he, + struct hist_browser *hb, bool unfold) { hist_entry__init_have_children(he); he->unfolded = unfold ? he->has_children : false; if (he->has_children) { - int n = callchain__set_folding(&he->sorted_chain, unfold); + int n; + + if (he->leaf) + n = callchain__set_folding(&he->sorted_chain, unfold); + else + n = hierarchy_set_folding(hb, he, unfold); + he->nr_rows = unfold ? n : 0; } else he->nr_rows = 0; @@ -500,19 +525,32 @@ static void __hist_browser__set_folding(struct hist_browser *browser, bool unfold) { struct rb_node *nd; - struct hists *hists = browser->hists; + struct hist_entry *he; + double percent; - for (nd = rb_first(&hists->entries); - (nd = hists__filter_entries(nd, browser->min_pcnt)) != NULL; - nd = rb_next(nd)) { - struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node); - hist_entry__set_folding(he, unfold); - browser->nr_callchain_rows += he->nr_rows; + nd = rb_first(&browser->hists->entries); + while (nd) { + he = rb_entry(nd, struct hist_entry, rb_node); + + /* set folding state even if it's currently folded */ + nd = __rb_hierarchy_next(nd, HMD_FORCE_CHILD); + + hist_entry__set_folding(he, browser, unfold); + + percent = hist_entry__get_percent_limit(he); + if (he->filtered || percent < browser->min_pcnt) + continue; + + if (!he->depth || unfold) + browser->nr_hierarchy_entries++; + if (he->leaf) + browser->nr_callchain_rows += he->nr_rows; } } static void hist_browser__set_folding(struct hist_browser *browser, bool unfold) { + browser->nr_hierarchy_entries = 0; browser->nr_callchain_rows = 0; __hist_browser__set_folding(browser, unfold); @@ -2131,7 +2169,7 @@ static void hist_browser__update_percent_limit(struct hist_browser *hb, /* force to re-evaluate folding state of callchains */ he->init_have_children = false; - hist_entry__set_folding(he, false); + hist_entry__set_folding(he, hb, false); nd = rb_next(nd); }