Commit | Line | Data |
---|---|---|
9daa8123 AY |
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; | |
3be8e2a0 | 15 | struct exit_reasons_table *exit_reasons; |
9daa8123 AY |
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 | ||
3be8e2a0 AY |
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 | ||
9daa8123 AY |
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); | |
3be8e2a0 | 58 | struct child_event_ops *child_ops; |
9daa8123 AY |
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 | ||
9daa8123 AY |
95 | struct intlist *pid_list; |
96 | ||
97 | struct rb_root result; | |
98 | ||
99 | int timerfd; | |
100 | unsigned int display_time; | |
101 | bool live; | |
8cc5ec1f | 102 | bool force; |
9daa8123 AY |
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[]; | |
54c801ff | 138 | extern const char * const kvm_skip_events[]; |
9daa8123 AY |
139 | |
140 | #endif /* __PERF_KVM_STAT_H */ |