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