perf kvm: Use subtraction for comparison metrics
authorLeo Yan <leo.yan@linaro.org>
Wed, 15 Mar 2023 14:51:00 +0000 (22:51 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 15 Mar 2023 19:43:18 +0000 (16:43 -0300)
Currently the metrics comparison uses greater operator (>), it returns
the boolean value (0 or 1).

This patch changes to use subtraction as comparison result, which can
be used by histograms sorting.  Since the subtraction result is u64
type, we change key_cmp_fun's return type to int64_t to avoid overflow.

Signed-off-by: Leo Yan <leo.yan@linaro.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: linux-arm-kernel@lists.infradead.org
Link: https://lore.kernel.org/r/20230315145112.186603-2-leo.yan@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-kvm.c
tools/perf/util/kvm-stat.h

index c11f5454f35c544ab34f828979adb437b5c51306..fbdd46d38c137ac4ae2ac45d908ddd85f5de7716 100644 (file)
@@ -64,10 +64,10 @@ static u64 get_event_ ##func(struct kvm_event *event, int vcpu)             \
 
 #define COMPARE_EVENT_KEY(func, field)                                 \
 GET_EVENT_KEY(func, field)                                             \
-static int cmp_event_ ## func(struct kvm_event *one,                   \
+static int64_t cmp_event_ ## func(struct kvm_event *one,               \
                              struct kvm_event *two, int vcpu)          \
 {                                                                      \
-       return get_event_ ##func(one, vcpu) >                           \
+       return get_event_ ##func(one, vcpu) -                           \
               get_event_ ##func(two, vcpu);                            \
 }
 
@@ -525,7 +525,7 @@ static void insert_to_result(struct rb_root *result, struct kvm_event *event,
                p = container_of(*rb, struct kvm_event, rb);
                parent = *rb;
 
-               if (bigger(event, p, vcpu))
+               if (bigger(event, p, vcpu) > 0)
                        rb = &(*rb)->rb_left;
                else
                        rb = &(*rb)->rb_right;
index 40a4b66cfee6e193f10127bdc8d6cdf4278d445d..0c2400d9b227176c61b453d36cdcdc7529b3a740 100644 (file)
@@ -40,7 +40,7 @@ struct kvm_event {
        struct kvm_event_stats *vcpu;
 };
 
-typedef int (*key_cmp_fun)(struct kvm_event*, struct kvm_event*, int);
+typedef int64_t (*key_cmp_fun)(struct kvm_event*, struct kvm_event*, int);
 
 struct kvm_event_key {
        const char *name;