[PATCH v3 10/14] perf kvm: Polish sorting key

From: Leo Yan
Date: Tue Feb 28 2023 - 06:54:37 EST


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@xxxxxxxxxx>
Reviewed-by: James Clark <james.clark@xxxxxxx>
---
tools/perf/builtin-kvm.c | 27 +++++++++------------------
tools/perf/util/kvm-stat.h | 8 --------
2 files changed, 9 insertions(+), 26 deletions(-)

diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index 32dc697ff707..741ba65bf092 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -76,15 +76,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;
@@ -766,18 +757,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)
{
+ const char *key_array[] = {
+ "sample", "time", "max_t", "min_t", "mean_t",
+ };
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; 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 key: %s\n", kvm->sort_key);
return false;
}

@@ -1201,7 +1192,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))
diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h
index c38d320c7cbe..a8e919ca59f4 100644
--- a/tools/perf/util/kvm-stat.h
+++ b/tools/perf/util/kvm-stat.h
@@ -43,13 +43,6 @@ struct kvm_event {
struct hist_entry he;
};

-typedef int (*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,
@@ -92,7 +85,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;
--
2.34.1