Moving the position calculation into the diff command, so the position
is prepared inside hist_entry data and there's no need to compute in
the output display path.

It will be needed for next cleanup patches.

Cc: Arnaldo Carvalho de Melo <a...@ghostprotocols.net>
Cc: Peter Zijlstra <a.p.zijls...@chello.nl>
Cc: Ingo Molnar <mi...@elte.hu>
Cc: Paul Mackerras <pau...@samba.org>
Cc: Corey Ashford <cjash...@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweis...@gmail.com>
Cc: Paul E. McKenney <paul...@linux.vnet.ibm.com>
Cc: Andi Kleen <a...@firstfloor.org>
Cc: David Ahern <dsah...@gmail.com>
Cc: Namhyung Kim <namhy...@kernel.org>
Signed-off-by: Jiri Olsa <jo...@redhat.com>
---
 tools/perf/builtin-diff.c  | 47 ++++++++++++++++++++++++++++++----------------
 tools/perf/ui/stdio/hist.c |  4 +---
 tools/perf/util/sort.h     |  2 +-
 3 files changed, 33 insertions(+), 20 deletions(-)

diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c
index e9933fd..4e63979 100644
--- a/tools/perf/builtin-diff.c
+++ b/tools/perf/builtin-diff.c
@@ -70,8 +70,8 @@ static struct perf_tool tool = {
        .ordering_requires_timestamps = true,
 };
 
-static void perf_session__insert_hist_entry_by_name(struct rb_root *root,
-                                                   struct hist_entry *he)
+static void insert_hist_entry_by_name(struct rb_root *root,
+                                     struct hist_entry *he)
 {
        struct rb_node **p = &root->rb_node;
        struct rb_node *parent = NULL;
@@ -90,7 +90,7 @@ static void perf_session__insert_hist_entry_by_name(struct 
rb_root *root,
        rb_insert_color(&he->rb_node, root);
 }
 
-static void hists__resort_entries(struct hists *self)
+static void hists__name_resort(struct hists *self, bool sort)
 {
        unsigned long position = 1;
        struct rb_root tmp = RB_ROOT;
@@ -100,12 +100,16 @@ static void hists__resort_entries(struct hists *self)
                struct hist_entry *n = rb_entry(next, struct hist_entry, 
rb_node);
 
                next = rb_next(&n->rb_node);
-               rb_erase(&n->rb_node, &self->entries);
                n->position = position++;
-               perf_session__insert_hist_entry_by_name(&tmp, n);
+
+               if (sort) {
+                       rb_erase(&n->rb_node, &self->entries);
+                       insert_hist_entry_by_name(&tmp, n);
+               }
        }
 
-       self->entries = tmp;
+       if (sort)
+               self->entries = tmp;
 }
 
 static struct hist_entry *hists__find_entry(struct hists *self,
@@ -121,7 +125,7 @@ static struct hist_entry *hists__find_entry(struct hists 
*self,
                        n = n->rb_left;
                else if (cmp > 0)
                        n = n->rb_right;
-               else 
+               else
                        return iter;
        }
 
@@ -150,6 +154,24 @@ static struct perf_evsel *evsel_match(struct perf_evsel 
*evsel,
        return NULL;
 }
 
+static void resort_evlist(struct perf_evlist *evlist, bool name)
+{
+       struct perf_evsel *evsel;
+
+       list_for_each_entry(evsel, &evlist->entries, node) {
+               struct hists *hists = &evsel->hists;
+
+               hists__output_resort(hists);
+
+               /*
+                * The hists__name_resort only sets possition
+                * if name is false.
+                */
+               if (name || ((!name) && show_displacement))
+                       hists__name_resort(hists, name);
+       }
+}
+
 static int __cmd_diff(void)
 {
        int ret, i;
@@ -176,15 +198,8 @@ static int __cmd_diff(void)
        evlist_old = older->evlist;
        evlist_new = newer->evlist;
 
-       list_for_each_entry(evsel, &evlist_new->entries, node)
-               hists__output_resort(&evsel->hists);
-
-       list_for_each_entry(evsel, &evlist_old->entries, node) {
-               hists__output_resort(&evsel->hists);
-
-               if (show_displacement)
-                       hists__resort_entries(&evsel->hists);
-       }
+       resort_evlist(evlist_old, true);
+       resort_evlist(evlist_new, false);
 
        list_for_each_entry(evsel, &evlist_new->entries, node) {
                struct perf_evsel *evsel_old;
diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c
index 9bf7e9e..4ae9ee5 100644
--- a/tools/perf/ui/stdio/hist.c
+++ b/tools/perf/ui/stdio/hist.c
@@ -472,7 +472,6 @@ size_t hists__fprintf(struct hists *hists, struct hists 
*pair,
        struct rb_node *nd;
        size_t ret = 0;
        u64 total_period;
-       unsigned long position = 1;
        long displacement = 0;
        unsigned int width;
        const char *sep = symbol_conf.field_sep;
@@ -607,10 +606,9 @@ print_entries:
                if (show_displacement) {
                        if (h->pair != NULL)
                                displacement = ((long)h->pair->position -
-                                               (long)position);
+                                               (long)h->position);
                        else
                                displacement = 0;
-                       ++position;
                }
                ret += hist_entry__fprintf(h, max_cols, hists, pair, 
show_displacement,
                                           displacement, total_period, fp);
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index b0b4752..967d381 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -72,8 +72,8 @@ struct hist_entry {
        u8                      filtered;
        char                    *srcline;
        struct symbol           *parent;
+       unsigned long           position;
        union {
-               unsigned long     position;
                struct hist_entry *pair;
                struct rb_root    sorted_chain;
        };
-- 
1.7.11.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to