perf c2c: Fix return type for histogram sorting comparision functions
authorAndres Freund <andres@anarazel.de>
Thu, 9 Jan 2020 04:30:30 +0000 (20:30 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Feb 2020 14:18:12 +0000 (14:18 +0000)
commit c1c8013ec34d7163431d18367808ea40b2e305f8 upstream.

Commit 722ddfde366f ("perf tools: Fix time sorting") changed - correctly
so - hist_entry__sort to return int64. Unfortunately several of the
builtin-c2c.c comparison routines only happened to work due the cast
caused by the wrong return type.

This causes meaningless ordering of both the cacheline list, and the
cacheline details page. E.g a simple:

  perf c2c record -a sleep 3
  perf c2c report

will result in cacheline table like
  =================================================
             Shared Data Cache Line Table
  =================================================
  #
  #        ------- Cacheline ----------    Total     Tot  - LLC Load Hitm -  - Store Reference -  - Load Dram -     LLC  Total  - Core Load Hit -  - LLC Load Hit -
  # Index         Address  Node  PA cnt  records    Hitm  Total  Lcl    Rmt  Total  L1Hit  L1Miss     Lcl   Rmt  Ld Miss  Loads    FB    L1   L2     Llc      Rmt
  # .....  ..............  ....  ......  .......  ......  .....  .....  ...  ....   .....  ......  ......  ....  ......   .....  .....  ..... ...  ....     .......

        0  0x7f0d27ffba00   N/A       0       52   0.12%     13      6    7    12      12       0       0     7      14      40      4     16    0    0           0
        1  0x7f0d27ff61c0   N/A       0     6353  14.04%   1475    801  674   779     779       0       0   718    1392    5574   1299   1967    0  115           0
        2  0x7f0d26d3ec80   N/A       0       71   0.15%     16      4   12    13      13       0       0    12      24      58      1     20    0    9           0
        3  0x7f0d26d3ec00   N/A       0       98   0.22%     23     17    6    19      19       0       0     6      12      79      0     40    0   10           0

i.e. with the list not being ordered by Total Hitm.

Fixes: 722ddfde366f ("perf tools: Fix time sorting")
Signed-off-by: Andres Freund <andres@anarazel.de>
Tested-by: Michael Petlan <mpetlan@redhat.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: stable@vger.kernel.org # v3.16+
Link: http://lore.kernel.org/lkml/20200109043030.233746-1-andres@anarazel.de
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
tools/perf/builtin-c2c.c

index bec7a2f1fb4dc34d6e87d954b72b078133746b7f..264d458bfe2ae644a861265052770fc183353042 100644 (file)
@@ -528,8 +528,8 @@ tot_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
 {
        struct c2c_hist_entry *c2c_left;
        struct c2c_hist_entry *c2c_right;
-       unsigned int tot_hitm_left;
-       unsigned int tot_hitm_right;
+       uint64_t tot_hitm_left;
+       uint64_t tot_hitm_right;
 
        c2c_left  = container_of(left, struct c2c_hist_entry, he);
        c2c_right = container_of(right, struct c2c_hist_entry, he);
@@ -562,7 +562,8 @@ __f ## _cmp(struct perf_hpp_fmt *fmt __maybe_unused,                        \
                                                                        \
        c2c_left  = container_of(left, struct c2c_hist_entry, he);      \
        c2c_right = container_of(right, struct c2c_hist_entry, he);     \
-       return c2c_left->stats.__f - c2c_right->stats.__f;              \
+       return (uint64_t) c2c_left->stats.__f -                         \
+              (uint64_t) c2c_right->stats.__f;                         \
 }
 
 #define STAT_FN(__f)           \
@@ -615,7 +616,8 @@ ld_llcmiss_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
        c2c_left  = container_of(left, struct c2c_hist_entry, he);
        c2c_right = container_of(right, struct c2c_hist_entry, he);
 
-       return llc_miss(&c2c_left->stats) - llc_miss(&c2c_right->stats);
+       return (uint64_t) llc_miss(&c2c_left->stats) -
+              (uint64_t) llc_miss(&c2c_right->stats);
 }
 
 static uint64_t total_records(struct c2c_stats *stats)