perf stat: Fix saved values rbtree lookup
authorAndi Kleen <ak@linux.intel.com>
Mon, 24 Jul 2017 23:40:03 +0000 (16:40 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 11 Aug 2017 13:42:52 +0000 (10:42 -0300)
The stat shadow saved values rbtree is indexed by a pointer.  Fix the
comparison function:

- We cannot return a pointer delta as an int because that loses bits on
  64bit.

- Doing pointer arithmetic on the struct pointer only works if the
  objects are spaced by the multiple of the object size, which is not
  guaranteed for individual malloc'ed object

Replace it with a proper comparison.

This fixes various problems with values not being found.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/20170724234015.5165-4-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/stat-shadow.c

index 719d6cb86952e5c6482e7a09070370360efe2030..a04cf56d3517fb3955e6d2a7bc3efa3132d818fc 100644 (file)
@@ -70,7 +70,11 @@ static int saved_value_cmp(struct rb_node *rb_node, const void *entry)
                return a->ctx - b->ctx;
        if (a->cpu != b->cpu)
                return a->cpu - b->cpu;
-       return a->evsel - b->evsel;
+       if (a->evsel == b->evsel)
+               return 0;
+       if ((char *)a->evsel < (char *)b->evsel)
+               return -1;
+       return +1;
 }
 
 static struct rb_node *saved_value_new(struct rblist *rblist __maybe_unused,