Commit dd787ae4 authored by Leo Yan's avatar Leo Yan Committed by Arnaldo Carvalho de Melo

perf kvm: Use subtraction for comparison metrics

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: default avatarLeo 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.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent f098376d
...@@ -64,10 +64,10 @@ static u64 get_event_ ##func(struct kvm_event *event, int vcpu) \ ...@@ -64,10 +64,10 @@ static u64 get_event_ ##func(struct kvm_event *event, int vcpu) \
#define COMPARE_EVENT_KEY(func, field) \ #define COMPARE_EVENT_KEY(func, field) \
GET_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) \ struct kvm_event *two, int vcpu) \
{ \ { \
return get_event_ ##func(one, vcpu) > \ return get_event_ ##func(one, vcpu) - \
get_event_ ##func(two, vcpu); \ get_event_ ##func(two, vcpu); \
} }
...@@ -525,7 +525,7 @@ static void insert_to_result(struct rb_root *result, struct kvm_event *event, ...@@ -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); p = container_of(*rb, struct kvm_event, rb);
parent = *rb; parent = *rb;
if (bigger(event, p, vcpu)) if (bigger(event, p, vcpu) > 0)
rb = &(*rb)->rb_left; rb = &(*rb)->rb_left;
else else
rb = &(*rb)->rb_right; rb = &(*rb)->rb_right;
......
...@@ -40,7 +40,7 @@ struct kvm_event { ...@@ -40,7 +40,7 @@ struct kvm_event {
struct kvm_event_stats *vcpu; 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 { struct kvm_event_key {
const char *name; const char *name;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment