Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1354138

[PATCH v2 7/7] perf tools: Recalc total periods using top-level entries in hierarchy

From Namhyung Kim <namhyung@kernel.org>
Newsgroups linux.kernel
Subject [PATCH v2 7/7] perf tools: Recalc total periods using top-level entries in hierarchy
Date 2016-03-09 14:50 +0100
Message-ID <raMEX-9f-25@gated-at.bofh.it> (permalink)
References <raMEW-9f-7@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


When hierarchy mode is enabled, each entries in a same hierarchy shares
period.  IOW an upper level entry's period is a sum of lower level
entries.  Thus perf uses only one of them to calculate the total period
of hists.  It was lowest-level (leaf) entries but it has a problem when
it comes to filters.

If a filter is applied, entries in the same level will be filtered or
not.  But upper level entries still have period of their sum including
filtered one.  So total sum of upper level entries will not be same as
sum of lower level entries.

This resulted in entries having more than 100% of overhead and it can be
produced using perf top with filter(s).

Reported-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/hist.c | 44 ++++++++++++++++++++++++++++++++++----------
 1 file changed, 34 insertions(+), 10 deletions(-)

diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index a98f9345f686..290b3cbf6877 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -1453,6 +1453,31 @@ void hists__inc_stats(struct hists *hists, struct hist_entry *h)
 	hists->stats.total_period += h->stat.period;
 }
 
+static void hierarchy_recalc_total_periods(struct hists *hists)
+{
+	struct rb_node *node;
+	struct hist_entry *he;
+
+	node = rb_first(&hists->entries);
+
+	hists->stats.total_period = 0;
+	hists->stats.total_non_filtered_period = 0;
+
+	/*
+	 * recalculate total period using top-level entries only
+	 * since lower level entries only see non-filtered entries
+	 * but upper level entries have sum of both entries.
+	 */
+	while (node) {
+		he = rb_entry(node, struct hist_entry, rb_node);
+		node = rb_next(node);
+
+		hists->stats.total_period += he->stat.period;
+		if (!he->filtered)
+			hists->stats.total_non_filtered_period += he->stat.period;
+	}
+}
+
 static void hierarchy_insert_output_entry(struct rb_root *root,
 					  struct hist_entry *he)
 {
@@ -1518,11 +1543,6 @@ static void hists__hierarchy_output_resort(struct hists *hists,
 			continue;
 		}
 
-		/* only update stat for leaf entries to avoid duplication */
-		hists__inc_stats(hists, he);
-		if (!he->filtered)
-			hists__calc_col_len(hists, he);
-
 		if (!use_callchain)
 			continue;
 
@@ -1602,11 +1622,13 @@ static void output_resort(struct hists *hists, struct ui_progress *prog,
 	hists__reset_col_len(hists);
 
 	if (symbol_conf.report_hierarchy) {
-		return hists__hierarchy_output_resort(hists, prog,
-						      &hists->entries_collapsed,
-						      &hists->entries,
-						      min_callchain_hits,
-						      use_callchain);
+		hists__hierarchy_output_resort(hists, prog,
+					       &hists->entries_collapsed,
+					       &hists->entries,
+					       min_callchain_hits,
+					       use_callchain);
+		hierarchy_recalc_total_periods(hists);
+		return;
 	}
 
 	if (sort__need_collapse)
@@ -1927,6 +1949,8 @@ static void hists__filter_hierarchy(struct hists *hists, int type, const void *a
 		}
 	}
 
+	hierarchy_recalc_total_periods(hists);
+
 	/*
 	 * resort output after applying a new filter since filter in a lower
 	 * hierarchy can change periods in a upper hierarchy.
-- 
2.7.2

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCHSET 0/7] perf tools: Fix and cleanups for hierarchy mode (v2) Namhyung Kim <namhyung@kernel.org> - 2016-03-09 14:50 +0100
  [PATCH v2 5/7] perf hists browser: Cleanup hist_browser__fprintf_hierarchy_entry() Namhyung Kim <namhyung@kernel.org> - 2016-03-09 14:50 +0100
    [tip:perf/core] perf hists browser: Cleanup  hist_browser__fprintf_hierarchy_entry() tip-bot for Namhyung Kim <tipbot@zytor.com> - 2016-03-11 10:00 +0100
  [PATCH v2 7/7] perf tools: Recalc total periods using top-level entries in hierarchy Namhyung Kim <namhyung@kernel.org> - 2016-03-09 14:50 +0100
    [tip:perf/core] perf tools: Recalc total periods using top-level  entries in hierarchy tip-bot for Namhyung Kim <tipbot@zytor.com> - 2016-03-11 10:00 +0100
  [PATCH v2 1/7] perf tools: Fix hist_entry__filter() for hierarchy Namhyung Kim <namhyung@kernel.org> - 2016-03-09 14:50 +0100
    [tip:perf/core] perf tools: Fix hist_entry__filter() for hierarchy tip-bot for Namhyung Kim <tipbot@zytor.com> - 2016-03-11 09:50 +0100
  [PATCH v2 3/7] perf tools: Fix command line filters in hierarchy mode Namhyung Kim <namhyung@kernel.org> - 2016-03-09 15:00 +0100
    [tip:perf/core] perf tools: Fix command line filters in hierarchy  mode tip-bot for Namhyung Kim <tipbot@zytor.com> - 2016-03-11 09:50 +0100
  [PATCH v2 4/7] perf tools: Remove hist_entry->fmt field Namhyung Kim <namhyung@kernel.org> - 2016-03-09 15:00 +0100
    [tip:perf/core] perf tools: Remove hist_entry->fmt field tip-bot for Namhyung Kim <tipbot@zytor.com> - 2016-03-11 10:00 +0100
  Re: [PATCHSET 0/7] perf tools: Fix and cleanups for hierarchy mode  (v2) Jiri Olsa <jolsa@redhat.com> - 2016-03-10 11:40 +0100

csiph-web