perf kvm: Polish sorting key
authorLeo Yan <leo.yan@linaro.org>
Wed, 15 Mar 2023 14:51:08 +0000 (22:51 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 15 Mar 2023 19:49:31 +0000 (16:49 -0300)
Since histograms supports sorting, the tool doesn't need to maintain the
mapping between the sorting keys and the corresponding comparison
callbacks, therefore, this patch removes structure kvm_event_key.

But we still need to validate the sorting key, this patch uses an array
for sorting keys and renames function select_key() to is_valid_key()
to validate the sorting key passed by user.

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 ae1c8c2..d102d3a 100644 (file)
@@ -77,15 +77,6 @@ COMPARE_EVENT_KEY(min, stats.min);
 COMPARE_EVENT_KEY(count, stats.n);
 COMPARE_EVENT_KEY(mean, stats.mean);
 
-#define DEF_SORT_NAME_KEY(name, compare_key)                           \
-       { #name, cmp_event_ ## compare_key }
-
-static struct kvm_event_key keys[] = {
-       DEF_SORT_NAME_KEY(sample, count),
-       DEF_SORT_NAME_KEY(time, mean),
-       { NULL, NULL }
-};
-
 struct kvm_hists {
        struct hists            hists;
        struct perf_hpp_list    list;
@@ -759,18 +750,18 @@ static bool handle_kvm_event(struct perf_kvm_stat *kvm,
        return true;
 }
 
-static bool select_key(struct perf_kvm_stat *kvm)
+static bool is_valid_key(struct perf_kvm_stat *kvm)
 {
-       int i;
+       static const char *key_array[] = {
+               "ev_name", "sample", "time", "max_t", "min_t", "mean_t",
+       };
+       unsigned int i;
 
-       for (i = 0; keys[i].name; i++) {
-               if (!strcmp(keys[i].name, kvm->sort_key)) {
-                       kvm->compare = keys[i].key;
+       for (i = 0; i < ARRAY_SIZE(key_array); i++)
+               if (!strcmp(key_array[i], kvm->sort_key))
                        return true;
-               }
-       }
 
-       pr_err("Unknown compare key:%s\n", kvm->sort_key);
+       pr_err("Unsupported sort key: %s\n", kvm->sort_key);
        return false;
 }
 
@@ -1200,7 +1191,7 @@ static int kvm_events_live_report(struct perf_kvm_stat *kvm)
                return ret;
 
        if (!verify_vcpu(kvm->trace_vcpu) ||
-           !select_key(kvm) ||
+           !is_valid_key(kvm) ||
            !register_kvm_events_ops(kvm)) {
                goto out;
        }
@@ -1395,7 +1386,7 @@ static int kvm_events_report_vcpu(struct perf_kvm_stat *kvm)
        if (!verify_vcpu(vcpu))
                goto exit;
 
-       if (!select_key(kvm))
+       if (!is_valid_key(kvm))
                goto exit;
 
        if (!register_kvm_events_ops(kvm))
index 3f0cbec..35d0389 100644 (file)
@@ -49,13 +49,6 @@ struct kvm_event {
        struct hist_entry he;
 };
 
-typedef int64_t (*key_cmp_fun)(struct kvm_event*, struct kvm_event*, int);
-
-struct kvm_event_key {
-       const char *name;
-       key_cmp_fun key;
-};
-
 struct child_event_ops {
        void (*get_key)(struct evsel *evsel,
                        struct perf_sample *sample,
@@ -98,7 +91,6 @@ struct perf_kvm_stat {
        const char *exit_reasons_isa;
 
        struct kvm_events_ops *events_ops;
-       key_cmp_fun compare;
 
        u64 total_time;
        u64 total_count;