Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v3.18 139 lines 3.1 kB view raw
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 11struct event_key { 12 #define INVALID_KEY (~0ULL) 13 u64 key; 14 int info; 15 struct exit_reasons_table *exit_reasons; 16}; 17 18struct kvm_event_stats { 19 u64 time; 20 struct stats stats; 21}; 22 23struct 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 36typedef int (*key_cmp_fun)(struct kvm_event*, struct kvm_event*, int); 37 38struct kvm_event_key { 39 const char *name; 40 key_cmp_fun key; 41}; 42 43struct perf_kvm_stat; 44 45struct 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 52struct 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 64struct 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 72struct 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 104struct kvm_reg_events_ops { 105 const char *name; 106 struct kvm_events_ops *ops; 107}; 108 109void exit_event_get_key(struct perf_evsel *evsel, 110 struct perf_sample *sample, 111 struct event_key *key); 112bool exit_event_begin(struct perf_evsel *evsel, 113 struct perf_sample *sample, 114 struct event_key *key); 115bool exit_event_end(struct perf_evsel *evsel, 116 struct perf_sample *sample, 117 struct event_key *key); 118void exit_event_decode_key(struct perf_kvm_stat *kvm, 119 struct event_key *key, 120 char *decode); 121 122bool kvm_exit_event(struct perf_evsel *evsel); 123bool 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 */ 133int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid); 134 135extern const char * const kvm_events_tp[]; 136extern struct kvm_reg_events_ops kvm_reg_events_ops[]; 137extern const char * const kvm_skip_events[]; 138 139#endif /* __PERF_KVM_STAT_H */