Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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  * arch specific callbacks and data structures
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 /* HAVE_KVM_STAT_SUPPORT */
0150 
0151 extern int kvm_add_default_arch_event(int *argc, const char **argv);
0152 #endif /* __PERF_KVM_STAT_H */