0001
0002 #ifndef __PERF_KVM_STAT_H
0003 #define __PERF_KVM_STAT_H
0004
0005 #ifdef HAVE_KVM_STAT_SUPPORT
0006
0007 #include "tool.h"
0008 #include "stat.h"
0009 #include "record.h"
0010
0011 struct evsel;
0012 struct evlist;
0013 struct perf_session;
0014
0015 struct event_key {
0016 #define INVALID_KEY (~0ULL)
0017 u64 key;
0018 int info;
0019 struct exit_reasons_table *exit_reasons;
0020 };
0021
0022 struct kvm_event_stats {
0023 u64 time;
0024 struct stats stats;
0025 };
0026
0027 struct kvm_event {
0028 struct list_head hash_entry;
0029 struct rb_node rb;
0030
0031 struct event_key key;
0032
0033 struct kvm_event_stats total;
0034
0035 #define DEFAULT_VCPU_NUM 8
0036 int max_vcpu;
0037 struct kvm_event_stats *vcpu;
0038 };
0039
0040 typedef int (*key_cmp_fun)(struct kvm_event*, struct kvm_event*, int);
0041
0042 struct kvm_event_key {
0043 const char *name;
0044 key_cmp_fun key;
0045 };
0046
0047 struct perf_kvm_stat;
0048
0049 struct child_event_ops {
0050 void (*get_key)(struct evsel *evsel,
0051 struct perf_sample *sample,
0052 struct event_key *key);
0053 const char *name;
0054 };
0055
0056 struct kvm_events_ops {
0057 bool (*is_begin_event)(struct evsel *evsel,
0058 struct perf_sample *sample,
0059 struct event_key *key);
0060 bool (*is_end_event)(struct evsel *evsel,
0061 struct perf_sample *sample, struct event_key *key);
0062 struct child_event_ops *child_ops;
0063 void (*decode_key)(struct perf_kvm_stat *kvm, struct event_key *key,
0064 char *decode);
0065 const char *name;
0066 };
0067
0068 struct exit_reasons_table {
0069 unsigned long exit_code;
0070 const char *reason;
0071 };
0072
0073 #define EVENTS_BITS 12
0074 #define EVENTS_CACHE_SIZE (1UL << EVENTS_BITS)
0075
0076 struct perf_kvm_stat {
0077 struct perf_tool tool;
0078 struct record_opts opts;
0079 struct evlist *evlist;
0080 struct perf_session *session;
0081
0082 const char *file_name;
0083 const char *report_event;
0084 const char *sort_key;
0085 int trace_vcpu;
0086
0087 struct exit_reasons_table *exit_reasons;
0088 const char *exit_reasons_isa;
0089
0090 struct kvm_events_ops *events_ops;
0091 key_cmp_fun compare;
0092 struct list_head kvm_events_cache[EVENTS_CACHE_SIZE];
0093
0094 u64 total_time;
0095 u64 total_count;
0096 u64 lost_events;
0097 u64 duration;
0098
0099 struct intlist *pid_list;
0100
0101 struct rb_root result;
0102
0103 int timerfd;
0104 unsigned int display_time;
0105 bool live;
0106 bool force;
0107 };
0108
0109 struct kvm_reg_events_ops {
0110 const char *name;
0111 struct kvm_events_ops *ops;
0112 };
0113
0114 void exit_event_get_key(struct evsel *evsel,
0115 struct perf_sample *sample,
0116 struct event_key *key);
0117 bool exit_event_begin(struct evsel *evsel,
0118 struct perf_sample *sample,
0119 struct event_key *key);
0120 bool exit_event_end(struct evsel *evsel,
0121 struct perf_sample *sample,
0122 struct event_key *key);
0123 void exit_event_decode_key(struct perf_kvm_stat *kvm,
0124 struct event_key *key,
0125 char *decode);
0126
0127 bool kvm_exit_event(struct evsel *evsel);
0128 bool kvm_entry_event(struct evsel *evsel);
0129 int setup_kvm_events_tp(struct perf_kvm_stat *kvm);
0130
0131 #define define_exit_reasons_table(name, symbols) \
0132 static struct exit_reasons_table name[] = { \
0133 symbols, { -1, NULL } \
0134 }
0135
0136
0137
0138
0139 int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid);
0140
0141 extern const char *kvm_events_tp[];
0142 extern struct kvm_reg_events_ops kvm_reg_events_ops[];
0143 extern const char * const kvm_skip_events[];
0144 extern const char *vcpu_id_str;
0145 extern const int decode_str_len;
0146 extern const char *kvm_exit_reason;
0147 extern const char *kvm_entry_trace;
0148 extern const char *kvm_exit_trace;
0149 #endif
0150
0151 extern int kvm_add_default_arch_event(int *argc, const char **argv);
0152 #endif