diff options
Diffstat (limited to 'tools/perf/builtin-kvm.c')
-rw-r--r-- | tools/perf/builtin-kvm.c | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 4418d9214872..bff666458b28 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c | |||
@@ -30,7 +30,6 @@ | |||
30 | #include <math.h> | 30 | #include <math.h> |
31 | 31 | ||
32 | #ifdef HAVE_KVM_STAT_SUPPORT | 32 | #ifdef HAVE_KVM_STAT_SUPPORT |
33 | #include <asm/kvm_perf.h> | ||
34 | #include "util/kvm-stat.h" | 33 | #include "util/kvm-stat.h" |
35 | 34 | ||
36 | void exit_event_get_key(struct perf_evsel *evsel, | 35 | void exit_event_get_key(struct perf_evsel *evsel, |
@@ -38,12 +37,12 @@ void exit_event_get_key(struct perf_evsel *evsel, | |||
38 | struct event_key *key) | 37 | struct event_key *key) |
39 | { | 38 | { |
40 | key->info = 0; | 39 | key->info = 0; |
41 | key->key = perf_evsel__intval(evsel, sample, KVM_EXIT_REASON); | 40 | key->key = perf_evsel__intval(evsel, sample, kvm_exit_reason); |
42 | } | 41 | } |
43 | 42 | ||
44 | bool kvm_exit_event(struct perf_evsel *evsel) | 43 | bool kvm_exit_event(struct perf_evsel *evsel) |
45 | { | 44 | { |
46 | return !strcmp(evsel->name, KVM_EXIT_TRACE); | 45 | return !strcmp(evsel->name, kvm_exit_trace); |
47 | } | 46 | } |
48 | 47 | ||
49 | bool exit_event_begin(struct perf_evsel *evsel, | 48 | bool exit_event_begin(struct perf_evsel *evsel, |
@@ -59,7 +58,7 @@ bool exit_event_begin(struct perf_evsel *evsel, | |||
59 | 58 | ||
60 | bool kvm_entry_event(struct perf_evsel *evsel) | 59 | bool kvm_entry_event(struct perf_evsel *evsel) |
61 | { | 60 | { |
62 | return !strcmp(evsel->name, KVM_ENTRY_TRACE); | 61 | return !strcmp(evsel->name, kvm_entry_trace); |
63 | } | 62 | } |
64 | 63 | ||
65 | bool exit_event_end(struct perf_evsel *evsel, | 64 | bool exit_event_end(struct perf_evsel *evsel, |
@@ -91,7 +90,7 @@ void exit_event_decode_key(struct perf_kvm_stat *kvm, | |||
91 | const char *exit_reason = get_exit_reason(kvm, key->exit_reasons, | 90 | const char *exit_reason = get_exit_reason(kvm, key->exit_reasons, |
92 | key->key); | 91 | key->key); |
93 | 92 | ||
94 | scnprintf(decode, DECODE_STR_LEN, "%s", exit_reason); | 93 | scnprintf(decode, decode_str_len, "%s", exit_reason); |
95 | } | 94 | } |
96 | 95 | ||
97 | static bool register_kvm_events_ops(struct perf_kvm_stat *kvm) | 96 | static bool register_kvm_events_ops(struct perf_kvm_stat *kvm) |
@@ -357,7 +356,7 @@ static bool handle_end_event(struct perf_kvm_stat *kvm, | |||
357 | time_diff = sample->time - time_begin; | 356 | time_diff = sample->time - time_begin; |
358 | 357 | ||
359 | if (kvm->duration && time_diff > kvm->duration) { | 358 | if (kvm->duration && time_diff > kvm->duration) { |
360 | char decode[DECODE_STR_LEN]; | 359 | char decode[decode_str_len]; |
361 | 360 | ||
362 | kvm->events_ops->decode_key(kvm, &event->key, decode); | 361 | kvm->events_ops->decode_key(kvm, &event->key, decode); |
363 | if (!skip_event(decode)) { | 362 | if (!skip_event(decode)) { |
@@ -385,7 +384,8 @@ struct vcpu_event_record *per_vcpu_record(struct thread *thread, | |||
385 | return NULL; | 384 | return NULL; |
386 | } | 385 | } |
387 | 386 | ||
388 | vcpu_record->vcpu_id = perf_evsel__intval(evsel, sample, VCPU_ID); | 387 | vcpu_record->vcpu_id = perf_evsel__intval(evsel, sample, |
388 | vcpu_id_str); | ||
389 | thread__set_priv(thread, vcpu_record); | 389 | thread__set_priv(thread, vcpu_record); |
390 | } | 390 | } |
391 | 391 | ||
@@ -574,7 +574,7 @@ static void show_timeofday(void) | |||
574 | 574 | ||
575 | static void print_result(struct perf_kvm_stat *kvm) | 575 | static void print_result(struct perf_kvm_stat *kvm) |
576 | { | 576 | { |
577 | char decode[DECODE_STR_LEN]; | 577 | char decode[decode_str_len]; |
578 | struct kvm_event *event; | 578 | struct kvm_event *event; |
579 | int vcpu = kvm->trace_vcpu; | 579 | int vcpu = kvm->trace_vcpu; |
580 | 580 | ||
@@ -585,7 +585,7 @@ static void print_result(struct perf_kvm_stat *kvm) | |||
585 | 585 | ||
586 | pr_info("\n\n"); | 586 | pr_info("\n\n"); |
587 | print_vcpu_info(kvm); | 587 | print_vcpu_info(kvm); |
588 | pr_info("%*s ", DECODE_STR_LEN, kvm->events_ops->name); | 588 | pr_info("%*s ", decode_str_len, kvm->events_ops->name); |
589 | pr_info("%10s ", "Samples"); | 589 | pr_info("%10s ", "Samples"); |
590 | pr_info("%9s ", "Samples%"); | 590 | pr_info("%9s ", "Samples%"); |
591 | 591 | ||
@@ -604,7 +604,7 @@ static void print_result(struct perf_kvm_stat *kvm) | |||
604 | min = get_event_min(event, vcpu); | 604 | min = get_event_min(event, vcpu); |
605 | 605 | ||
606 | kvm->events_ops->decode_key(kvm, &event->key, decode); | 606 | kvm->events_ops->decode_key(kvm, &event->key, decode); |
607 | pr_info("%*s ", DECODE_STR_LEN, decode); | 607 | pr_info("%*s ", decode_str_len, decode); |
608 | pr_info("%10llu ", (unsigned long long)ecount); | 608 | pr_info("%10llu ", (unsigned long long)ecount); |
609 | pr_info("%8.2f%% ", (double)ecount / kvm->total_count * 100); | 609 | pr_info("%8.2f%% ", (double)ecount / kvm->total_count * 100); |
610 | pr_info("%8.2f%% ", (double)etime / kvm->total_time * 100); | 610 | pr_info("%8.2f%% ", (double)etime / kvm->total_time * 100); |
@@ -1132,6 +1132,11 @@ exit: | |||
1132 | _p; \ | 1132 | _p; \ |
1133 | }) | 1133 | }) |
1134 | 1134 | ||
1135 | int __weak setup_kvm_events_tp(struct perf_kvm_stat *kvm __maybe_unused) | ||
1136 | { | ||
1137 | return 0; | ||
1138 | } | ||
1139 | |||
1135 | static int | 1140 | static int |
1136 | kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv) | 1141 | kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv) |
1137 | { | 1142 | { |
@@ -1148,7 +1153,14 @@ kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv) | |||
1148 | NULL | 1153 | NULL |
1149 | }; | 1154 | }; |
1150 | const char * const *events_tp; | 1155 | const char * const *events_tp; |
1156 | int ret; | ||
1157 | |||
1151 | events_tp_size = 0; | 1158 | events_tp_size = 0; |
1159 | ret = setup_kvm_events_tp(kvm); | ||
1160 | if (ret < 0) { | ||
1161 | pr_err("Unable to setup the kvm tracepoints\n"); | ||
1162 | return ret; | ||
1163 | } | ||
1152 | 1164 | ||
1153 | for (events_tp = kvm_events_tp; *events_tp; events_tp++) | 1165 | for (events_tp = kvm_events_tp; *events_tp; events_tp++) |
1154 | events_tp_size++; | 1166 | events_tp_size++; |
@@ -1377,6 +1389,12 @@ static int kvm_events_live(struct perf_kvm_stat *kvm, | |||
1377 | /* | 1389 | /* |
1378 | * generate the event list | 1390 | * generate the event list |
1379 | */ | 1391 | */ |
1392 | err = setup_kvm_events_tp(kvm); | ||
1393 | if (err < 0) { | ||
1394 | pr_err("Unable to setup the kvm tracepoints\n"); | ||
1395 | return err; | ||
1396 | } | ||
1397 | |||
1380 | kvm->evlist = kvm_live_event_list(); | 1398 | kvm->evlist = kvm_live_event_list(); |
1381 | if (kvm->evlist == NULL) { | 1399 | if (kvm->evlist == NULL) { |
1382 | err = -1; | 1400 | err = -1; |