From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1423510AbcB0JmO (ORCPT ); Sat, 27 Feb 2016 04:42:14 -0500 Received: from torg.zytor.com ([198.137.202.12]:39194 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1756241AbcB0JmM (ORCPT ); Sat, 27 Feb 2016 04:42:12 -0500 Date: Sat, 27 Feb 2016 01:41:19 -0800 From: tip-bot for Namhyung Kim Message-ID: Cc: andi@firstfloor.org, acme@redhat.com, mingo@kernel.org, eranian@google.com, namhyung@kernel.org, tglx@linutronix.de, wangnan0@huawei.com, dsahern@gmail.com, jolsa@kernel.org, peterz@infradead.org, hpa@zytor.com, linux-kernel@vger.kernel.org Reply-To: namhyung@kernel.org, wangnan0@huawei.com, tglx@linutronix.de, mingo@kernel.org, acme@redhat.com, andi@firstfloor.org, eranian@google.com, hpa@zytor.com, peterz@infradead.org, linux-kernel@vger.kernel.org, dsahern@gmail.com, jolsa@kernel.org In-Reply-To: <1456488800-28124-1-git-send-email-namhyung@kernel.org> References: <1456488800-28124-1-git-send-email-namhyung@kernel.org> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf hists: Add more helper functions for the hierarchy mode Git-Commit-ID: a7b5895b91fb97f2b0dcc2e3ce47413c18d19ca5 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: a7b5895b91fb97f2b0dcc2e3ce47413c18d19ca5 Gitweb: http://git.kernel.org/tip/a7b5895b91fb97f2b0dcc2e3ce47413c18d19ca5 Author: Namhyung Kim AuthorDate: Fri, 26 Feb 2016 21:13:16 +0900 Committer: Arnaldo Carvalho de Melo CommitDate: Fri, 26 Feb 2016 11:20:35 -0300 perf hists: Add more helper functions for the hierarchy mode The hists__overhead_width() is to calculate width occupied by the overhead (and others) columns before the sort columns. The hist_entry__has_hiearchy_children() is to check whether an entry has lower entries (children) in the hierarchy to be shown in the output. This means the children should not be filtered out and above the percent limit. These two functions will be used to show information when all children of an entry is omitted by the percent limit (or filter). Signed-off-by: Namhyung Kim Cc: Andi Kleen Cc: David Ahern Cc: Jiri Olsa Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Wang Nan Link: http://lkml.kernel.org/r/1456488800-28124-1-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/ui/hist.c | 22 ++++++++++++++++++++++ tools/perf/util/hist.c | 25 +++++++++++++++++++++++++ tools/perf/util/hist.h | 3 +++ 3 files changed, 50 insertions(+) diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c index edbf854..7c0585c 100644 --- a/tools/perf/ui/hist.c +++ b/tools/perf/ui/hist.c @@ -643,6 +643,28 @@ unsigned int hists__sort_list_width(struct hists *hists) return ret; } +unsigned int hists__overhead_width(struct hists *hists) +{ + struct perf_hpp_fmt *fmt; + int ret = 0; + bool first = true; + struct perf_hpp dummy_hpp; + + hists__for_each_format(hists, fmt) { + if (perf_hpp__is_sort_entry(fmt) || perf_hpp__is_dynamic_entry(fmt)) + break; + + if (first) + first = false; + else + ret += 2; + + ret += fmt->width(fmt, &dummy_hpp, hists_to_evsel(hists)); + } + + return ret; +} + void perf_hpp__reset_width(struct perf_hpp_fmt *fmt, struct hists *hists) { if (perf_hpp__is_sort_entry(fmt)) diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index 1c53042..e716919 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c @@ -1582,6 +1582,31 @@ struct rb_node *rb_hierarchy_prev(struct rb_node *node) return &he->rb_node; } +bool hist_entry__has_hierarchy_children(struct hist_entry *he, float limit) +{ + struct rb_node *node; + struct hist_entry *child; + float percent; + + if (he->leaf) + return false; + + node = rb_first(&he->hroot_out); + child = rb_entry(node, struct hist_entry, rb_node); + + while (node && child->filtered) { + node = rb_next(node); + child = rb_entry(node, struct hist_entry, rb_node); + } + + if (node) + percent = hist_entry__get_percent_limit(child); + else + percent = 0; + + return node && percent >= limit; +} + static void hists__remove_entry_filter(struct hists *hists, struct hist_entry *h, enum hist_filter filter) { diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index 722aa44..da3e7b6 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h @@ -410,6 +410,7 @@ static inline int script_browse(const char *script_opt __maybe_unused) #endif unsigned int hists__sort_list_width(struct hists *hists); +unsigned int hists__overhead_width(struct hists *hists); void hist__account_cycles(struct branch_stack *bs, struct addr_location *al, struct perf_sample *sample, bool nonany_branch_mode); @@ -439,4 +440,6 @@ static inline struct rb_node *rb_hierarchy_next(struct rb_node *node) #define HIERARCHY_INDENT 3 +bool hist_entry__has_hierarchy_children(struct hist_entry *he, float limit); + #endif /* __PERF_HIST_H */