root/tools/perf/util/kvm-stat.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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 
  11 struct evsel;
  12 struct evlist;
  13 struct perf_session;
  14 
  15 struct event_key {
  16         #define INVALID_KEY     (~0ULL)
  17         u64 key;
  18         int info;
  19         struct exit_reasons_table *exit_reasons;
  20 };
  21 
  22 struct kvm_event_stats {
  23         u64 time;
  24         struct stats stats;
  25 };
  26 
  27 struct 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 
  40 typedef int (*key_cmp_fun)(struct kvm_event*, struct kvm_event*, int);
  41 
  42 struct kvm_event_key {
  43         const char *name;
  44         key_cmp_fun key;
  45 };
  46 
  47 struct perf_kvm_stat;
  48 
  49 struct 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 
  56 struct 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 
  68 struct 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 
  76 struct 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 
 109 struct kvm_reg_events_ops {
 110         const char *name;
 111         struct kvm_events_ops *ops;
 112 };
 113 
 114 void exit_event_get_key(struct evsel *evsel,
 115                         struct perf_sample *sample,
 116                         struct event_key *key);
 117 bool exit_event_begin(struct evsel *evsel,
 118                       struct perf_sample *sample,
 119                       struct event_key *key);
 120 bool exit_event_end(struct evsel *evsel,
 121                     struct perf_sample *sample,
 122                     struct event_key *key);
 123 void exit_event_decode_key(struct perf_kvm_stat *kvm,
 124                            struct event_key *key,
 125                            char *decode);
 126 
 127 bool kvm_exit_event(struct evsel *evsel);
 128 bool kvm_entry_event(struct evsel *evsel);
 129 int 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  */
 139 int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid);
 140 
 141 extern const char *kvm_events_tp[];
 142 extern struct kvm_reg_events_ops kvm_reg_events_ops[];
 143 extern const char * const kvm_skip_events[];
 144 extern const char *vcpu_id_str;
 145 extern const int decode_str_len;
 146 extern const char *kvm_exit_reason;
 147 extern const char *kvm_entry_trace;
 148 extern const char *kvm_exit_trace;
 149 #endif /* HAVE_KVM_STAT_SUPPORT */
 150 
 151 extern int kvm_add_default_arch_event(int *argc, const char **argv);
 152 #endif /* __PERF_KVM_STAT_H */

/* [<][>][^][v][top][bottom][index][help] */