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