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 struct intlist *pid_list; 96 97 struct rb_root result; 98 99 int timerfd; 100 unsigned int display_time; 101 bool live; 102 }; 103 104 struct kvm_reg_events_ops { 105 const char *name; 106 struct kvm_events_ops *ops; 107 }; 108 109 void exit_event_get_key(struct perf_evsel *evsel, 110 struct perf_sample *sample, 111 struct event_key *key); 112 bool exit_event_begin(struct perf_evsel *evsel, 113 struct perf_sample *sample, 114 struct event_key *key); 115 bool exit_event_end(struct perf_evsel *evsel, 116 struct perf_sample *sample, 117 struct event_key *key); 118 void exit_event_decode_key(struct perf_kvm_stat *kvm, 119 struct event_key *key, 120 char *decode); 121 122 bool kvm_exit_event(struct perf_evsel *evsel); 123 bool kvm_entry_event(struct perf_evsel *evsel); 124 125 #define define_exit_reasons_table(name, symbols) \ 126 static struct exit_reasons_table name[] = { \ 127 symbols, { -1, NULL } \ 128 } 129 130 /* 131 * arch specific callbacks and data structures 132 */ 133 int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid); 134 135 extern const char * const kvm_events_tp[]; 136 extern struct kvm_reg_events_ops kvm_reg_events_ops[]; 137 extern const char * const kvm_skip_events[]; 138 139 #endif /* __PERF_KVM_STAT_H */ 140