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


Groups > linux.kernel > #1482216 > unrolled thread

[PATCH 1/7] perf hist: Introduce hists__match_hierarchy()

Started byNamhyung Kim <namhyung@kernel.org>
First post2016-09-13 09:50 +0200
Last post2016-09-20 23:40 +0200
Articles 4 — 3 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCH 1/7] perf hist: Introduce hists__match_hierarchy() Namhyung Kim <namhyung@kernel.org> - 2016-09-13 09:50 +0200
    Re: [PATCH 1/7] perf hist: Introduce hists__match_hierarchy() Jiri Olsa <jolsa@redhat.com> - 2016-09-19 09:50 +0200
      Re: [PATCH 1/7] perf hist: Introduce hists__match_hierarchy() Namhyung Kim <namhyung@kernel.org> - 2016-09-20 03:20 +0200
    [tip:perf/core] perf hists: Introduce hists__match_hierarchy() tip-bot for Namhyung Kim <tipbot@zytor.com> - 2016-09-20 23:40 +0200

#1482216 — [PATCH 1/7] perf hist: Introduce hists__match_hierarchy()

FromNamhyung Kim <namhyung@kernel.org>
Date2016-09-13 09:50 +0200
Subject[PATCH 1/7] perf hist: Introduce hists__match_hierarchy()
Message-ID<sgQDD-7fb-9@gated-at.bofh.it>
The hists__match_hierarchy() is to find matching hist entries in a
group.  A matching entry has same values for all sort keys given.
With event group, a leader event should show other members in a
group.  So each entry in the leader should be able to find its pair
entries which have same values.  With hierarchy mode, it needs to
search all matching children in a hierarchy.

An example output would look like below:

  #               Overhead  Command / Shared Object / Symbol
  # ......................  ..................................
  #
      25.74%  27.18%        sh
         19.96%  24.14%        libc-2.24.so
            9.55%  14.64%        [.] __strcmp_sse2
            1.54%   0.00%        [.] __tfind
            1.07%   1.13%        [.] _int_malloc
  ...

In the above example, two overhead were shown - one for leader and
another for member.  They were matched since their command, dso and
symbol have same values.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/hist.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index de15dbcdcecf..be3f5ce31303 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -2174,6 +2174,51 @@ static struct hist_entry *hists__find_entry(struct hists *hists,
 	return NULL;
 }
 
+static struct hist_entry *hists__find_hierarchy_entry(struct rb_root *root,
+						      struct hist_entry *he)
+{
+	struct rb_node *n = root->rb_node;
+
+	while (n) {
+		struct hist_entry *iter;
+		struct perf_hpp_fmt *fmt;
+		int64_t cmp = 0;
+
+		iter = rb_entry(n, struct hist_entry, rb_node_in);
+		perf_hpp_list__for_each_sort_list(he->hpp_list, fmt) {
+			cmp = fmt->collapse(fmt, iter, he);
+			if (cmp)
+				break;
+		}
+
+		if (cmp < 0)
+			n = n->rb_left;
+		else if (cmp > 0)
+			n = n->rb_right;
+		else
+			return iter;
+	}
+
+	return NULL;
+}
+
+static void hists__match_hierarchy(struct rb_root *leader_root,
+				   struct rb_root *other_root)
+{
+	struct rb_node *nd;
+	struct hist_entry *pos, *pair;
+
+	for (nd = rb_first(leader_root); nd; nd = rb_next(nd)) {
+		pos  = rb_entry(nd, struct hist_entry, rb_node_in);
+		pair = hists__find_hierarchy_entry(other_root, pos);
+
+		if (pair) {
+			hist_entry__add_pair(pair, pos);
+			hists__match_hierarchy(&pos->hroot_in, &pair->hroot_in);
+		}
+	}
+}
+
 /*
  * Look for pairs to link to the leader buckets (hist_entries):
  */
@@ -2183,6 +2228,12 @@ void hists__match(struct hists *leader, struct hists *other)
 	struct rb_node *nd;
 	struct hist_entry *pos, *pair;
 
+	if (symbol_conf.report_hierarchy) {
+		/* hierarchy report always collapses entries */
+		return hists__match_hierarchy(&leader->entries_collapsed,
+					      &other->entries_collapsed);
+	}
+
 	if (hists__has(leader, need_collapse))
 		root = &leader->entries_collapsed;
 	else
-- 
2.9.3

[toc] | [next] | [standalone]


#1486218

FromJiri Olsa <jolsa@redhat.com>
Date2016-09-19 09:50 +0200
Message-ID<sj1uV-2ya-21@gated-at.bofh.it>
In reply to#1482216
On Tue, Sep 13, 2016 at 04:45:46PM +0900, Namhyung Kim wrote:

SNIP

> +static struct hist_entry *hists__find_hierarchy_entry(struct rb_root *root,
> +						      struct hist_entry *he)
> +{
> +	struct rb_node *n = root->rb_node;
> +
> +	while (n) {
> +		struct hist_entry *iter;
> +		struct perf_hpp_fmt *fmt;
> +		int64_t cmp = 0;
> +
> +		iter = rb_entry(n, struct hist_entry, rb_node_in);
> +		perf_hpp_list__for_each_sort_list(he->hpp_list, fmt) {
> +			cmp = fmt->collapse(fmt, iter, he);
> +			if (cmp)
> +				break;
> +		}

could you call hist_entry__collapse in here instead of above code?

thanks,
jirka

> +
> +		if (cmp < 0)
> +			n = n->rb_left;
> +		else if (cmp > 0)
> +			n = n->rb_right;
> +		else
> +			return iter;
> +	}
> +
> +	return NULL;
> +}
> +

[toc] | [prev] | [next] | [standalone]


#1486992

FromNamhyung Kim <namhyung@kernel.org>
Date2016-09-20 03:20 +0200
Message-ID<sjhT3-4IM-11@gated-at.bofh.it>
In reply to#1486218
Hi Jiri,

On Mon, Sep 19, 2016 at 4:48 PM, Jiri Olsa <jolsa@redhat.com> wrote:
> On Tue, Sep 13, 2016 at 04:45:46PM +0900, Namhyung Kim wrote:
>
> SNIP
>
>> +static struct hist_entry *hists__find_hierarchy_entry(struct rb_root *root,
>> +                                                   struct hist_entry *he)
>> +{
>> +     struct rb_node *n = root->rb_node;
>> +
>> +     while (n) {
>> +             struct hist_entry *iter;
>> +             struct perf_hpp_fmt *fmt;
>> +             int64_t cmp = 0;
>> +
>> +             iter = rb_entry(n, struct hist_entry, rb_node_in);
>> +             perf_hpp_list__for_each_sort_list(he->hpp_list, fmt) {
>> +                     cmp = fmt->collapse(fmt, iter, he);
>> +                     if (cmp)
>> +                             break;
>> +             }
>
> could you call hist_entry__collapse in here instead of above code?

Nope.  The hist_entry__collapse() traverses the whole sort list of the
event (hists->hpp_list) while this function only traverses its own
sort list (he->hpp_list).  These are different when hierarchy is used.

Thanks,
Namhyung

>
>> +
>> +             if (cmp < 0)
>> +                     n = n->rb_left;
>> +             else if (cmp > 0)
>> +                     n = n->rb_right;
>> +             else
>> +                     return iter;
>> +     }
>> +
>> +     return NULL;
>> +}
>> +



-- 
Thanks,
Namhyung

[toc] | [prev] | [next] | [standalone]


#1487656 — [tip:perf/core] perf hists: Introduce hists__match_hierarchy()

Fromtip-bot for Namhyung Kim <tipbot@zytor.com>
Date2016-09-20 23:40 +0200
Subject[tip:perf/core] perf hists: Introduce hists__match_hierarchy()
Message-ID<sjAVI-8wm-13@gated-at.bofh.it>
In reply to#1482216
Commit-ID:  09034de63e427a86ba96bedf39410eef7c9014a5
Gitweb:     http://git.kernel.org/tip/09034de63e427a86ba96bedf39410eef7c9014a5
Author:     Namhyung Kim <namhyung@kernel.org>
AuthorDate: Tue, 13 Sep 2016 16:45:46 +0900
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 13 Sep 2016 16:31:24 -0300

perf hists: Introduce hists__match_hierarchy()

The hists__match_hierarchy() is to find matching hist entries in a
group.  A matching entry has the same values for all sort keys given.

With an event group (e.g.: -e "{cycles,instructions}"), a leader event
should show other members in a group.  So each entry in the leader
should be able to find its pair entries which have same values.

With hierarchy mode, it needs to search all matching children in a
hierarchy.

An example output looks like:

  #               Overhead  Command / Shared Object / Symbol
  # ......................  ..................................
  #
      25.74%  27.18%        sh
         19.96%  24.14%        libc-2.24.so
            9.55%  14.64%        [.] __strcmp_sse2
            1.54%   0.00%        [.] __tfind
            1.07%   1.13%        [.] _int_malloc
  ...

In the above example, two overheads are shown - one for the leader and
another for the other group member.  They were matched since their
command, dso and symbol have the same values.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/20160913074552.13284-2-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/hist.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index de15dbc..be3f5ce 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -2174,6 +2174,51 @@ static struct hist_entry *hists__find_entry(struct hists *hists,
 	return NULL;
 }
 
+static struct hist_entry *hists__find_hierarchy_entry(struct rb_root *root,
+						      struct hist_entry *he)
+{
+	struct rb_node *n = root->rb_node;
+
+	while (n) {
+		struct hist_entry *iter;
+		struct perf_hpp_fmt *fmt;
+		int64_t cmp = 0;
+
+		iter = rb_entry(n, struct hist_entry, rb_node_in);
+		perf_hpp_list__for_each_sort_list(he->hpp_list, fmt) {
+			cmp = fmt->collapse(fmt, iter, he);
+			if (cmp)
+				break;
+		}
+
+		if (cmp < 0)
+			n = n->rb_left;
+		else if (cmp > 0)
+			n = n->rb_right;
+		else
+			return iter;
+	}
+
+	return NULL;
+}
+
+static void hists__match_hierarchy(struct rb_root *leader_root,
+				   struct rb_root *other_root)
+{
+	struct rb_node *nd;
+	struct hist_entry *pos, *pair;
+
+	for (nd = rb_first(leader_root); nd; nd = rb_next(nd)) {
+		pos  = rb_entry(nd, struct hist_entry, rb_node_in);
+		pair = hists__find_hierarchy_entry(other_root, pos);
+
+		if (pair) {
+			hist_entry__add_pair(pair, pos);
+			hists__match_hierarchy(&pos->hroot_in, &pair->hroot_in);
+		}
+	}
+}
+
 /*
  * Look for pairs to link to the leader buckets (hist_entries):
  */
@@ -2183,6 +2228,12 @@ void hists__match(struct hists *leader, struct hists *other)
 	struct rb_node *nd;
 	struct hist_entry *pos, *pair;
 
+	if (symbol_conf.report_hierarchy) {
+		/* hierarchy report always collapses entries */
+		return hists__match_hierarchy(&leader->entries_collapsed,
+					      &other->entries_collapsed);
+	}
+
 	if (hists__has(leader, need_collapse))
 		root = &leader->entries_collapsed;
 	else

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web