1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __PERF_KVM_STAT_H 3 #define __PERF_KVM_STAT_H 4 5 #include "../perf.h" 6 #include "evsel.h" 7 #include "evlist.h" 8 #include "session.h" 9 #include "tool.h" 10 #include "stat.h" 11 12 struct event_key { 13 #define INVALID_KEY (~0ULL) 14 u64 key; 15 int info; 16 struct exit_reasons_table *exit_reasons; 17 }; 18 19 struct kvm_event_stats { 20 u64 time; 21 struct stats stats; 22 }; 23 24 struct kvm_event { 25 struct list_head hash_entry; 26 struct rb_node rb; 27 28 struct event_key key; 29 30 struct kvm_event_stats total; 31 32 #define DEFAULT_VCPU_NUM 8 33 int max_vcpu; 34 struct kvm_event_stats *vcpu; 35 }; 36 37 typedef int (*key_cmp_fun)(struct kvm_event*, struct kvm_event*, int); 38 39 struct kvm_event_key { 40 const char *name; 41 key_cmp_fun key; 42 }; 43 44 struct perf_kvm_stat; 45 46 struct child_event_ops { 47 void (*get_key)(struct perf_evsel *evsel, 48 struct perf_sample *sample, 49 struct event_key *key); 50 const char *name; 51 }; 52 53 struct kvm_events_ops { 54 bool (*is_begin_event)(struct perf_evsel *evsel, 55 struct perf_sample *sample, 56 struct event_key *key); 57 bool (*is_end_event)(struct perf_evsel *evsel, 58 struct perf_sample *sample, struct event_key *key); 59 struct child_event_ops *child_ops; 60 void (*decode_key)(struct perf_kvm_stat *kvm, struct event_key *key, 61 char *decode); 62 const char *name; 63 }; 64 65 struct exit_reasons_table { 66 unsigned long exit_code; 67 const char *reason; 68 }; 69 70 #define EVENTS_BITS 12 71 #define EVENTS_CACHE_SIZE (1UL << EVENTS_BITS) 72 73 struct perf_kvm_stat { 74 struct perf_tool tool; 75 struct record_opts opts; 76 struct perf_evlist *evlist; 77 struct perf_session *session; 78 79 const char *file_name; 80 const char *report_event; 81 const char *sort_key; 82 int trace_vcpu; 83 84 struct exit_reasons_table *exit_reasons; 85 const char *exit_reasons_isa; 86 87 struct kvm_events_ops *events_ops; 88 key_cmp_fun compare; 89 struct list_head kvm_events_cache[EVENTS_CACHE_SIZE]; 90 91 u64 total_time; 92 u64 total_count; 93 u64 lost_events; 94 u64 duration; 95 96 struct intlist *pid_list; 97 98 struct rb_root result; 99 100 int timerfd; 101 unsigned int display_time; 102 bool live; 103 bool force; 104 }; 105 106 struct kvm_reg_events_ops { 107 const char *name; 108 struct kvm_events_ops *ops; 109 }; 110 111 void exit_event_get_key(struct perf_evsel *evsel, 112 struct perf_sample *sample, 113 struct event_key *key); 114 bool exit_event_begin(struct perf_evsel *evsel, 115 struct perf_sample *sample, 116 struct event_key *key); 117 bool exit_event_end(struct perf_evsel *evsel, 118 struct perf_sample *sample, 119 struct event_key *key); 120 void exit_event_decode_key(struct perf_kvm_stat *kvm, 121 struct event_key *key, 122 char *decode); 123 124 bool kvm_exit_event(struct perf_evsel *evsel); 125 bool kvm_entry_event(struct perf_evsel *evsel); 126 int setup_kvm_events_tp(struct perf_kvm_stat *kvm); 127 128 #define define_exit_reasons_table(name, symbols) \ 129 static struct exit_reasons_table name[] = { \ 130 symbols, { -1, NULL } \ 131 } 132 133 /* 134 * arch specific callbacks and data structures 135 */ 136 int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid); 137 138 extern const char *kvm_events_tp[]; 139 extern struct kvm_reg_events_ops kvm_reg_events_ops[]; 140 extern const char * const kvm_skip_events[]; 141 extern const char *vcpu_id_str; 142 extern const int decode_str_len; 143 extern const char *kvm_exit_reason; 144 extern const char *kvm_entry_trace; 145 extern const char *kvm_exit_trace; 146 147 #endif /* __PERF_KVM_STAT_H */ 148