192 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef __PERF_KVM_STAT_H3#define __PERF_KVM_STAT_H4 5#ifdef HAVE_KVM_STAT_SUPPORT6 7#include "tool.h"8#include "sort.h"9#include "stat.h"10#include "symbol.h"11#include "record.h"12 13#include <stdlib.h>14#include <linux/zalloc.h>15 16#define KVM_EVENT_NAME_LEN 4017 18struct evsel;19struct evlist;20struct perf_session;21 22struct event_key {23 #define INVALID_KEY (~0ULL)24 u64 key;25 int info;26 struct exit_reasons_table *exit_reasons;27};28 29struct kvm_info {30 char name[KVM_EVENT_NAME_LEN];31 refcount_t refcnt;32};33 34struct kvm_event_stats {35 u64 time;36 struct stats stats;37};38 39struct perf_kvm_stat;40 41struct kvm_event {42 struct list_head hash_entry;43 44 struct perf_kvm_stat *perf_kvm;45 struct event_key key;46 47 struct kvm_event_stats total;48 49 #define DEFAULT_VCPU_NUM 850 int max_vcpu;51 struct kvm_event_stats *vcpu;52 53 struct hist_entry he;54};55 56struct child_event_ops {57 void (*get_key)(struct evsel *evsel,58 struct perf_sample *sample,59 struct event_key *key);60 const char *name;61};62 63struct kvm_events_ops {64 bool (*is_begin_event)(struct evsel *evsel,65 struct perf_sample *sample,66 struct event_key *key);67 bool (*is_end_event)(struct evsel *evsel,68 struct perf_sample *sample, struct event_key *key);69 struct child_event_ops *child_ops;70 void (*decode_key)(struct perf_kvm_stat *kvm, struct event_key *key,71 char *decode);72 const char *name;73};74 75struct exit_reasons_table {76 unsigned long exit_code;77 const char *reason;78};79 80struct perf_kvm_stat {81 struct perf_tool tool;82 struct record_opts opts;83 struct evlist *evlist;84 struct perf_session *session;85 86 const char *file_name;87 const char *report_event;88 const char *sort_key;89 int trace_vcpu;90 91 /* Used when process events */92 struct addr_location al;93 94 struct exit_reasons_table *exit_reasons;95 const char *exit_reasons_isa;96 97 struct kvm_events_ops *events_ops;98 99 u64 total_time;100 u64 total_count;101 u64 lost_events;102 u64 duration;103 104 struct intlist *pid_list;105 106 int timerfd;107 unsigned int display_time;108 bool live;109 bool force;110 bool use_stdio;111};112 113struct kvm_reg_events_ops {114 const char *name;115 struct kvm_events_ops *ops;116};117 118void exit_event_get_key(struct evsel *evsel,119 struct perf_sample *sample,120 struct event_key *key);121bool exit_event_begin(struct evsel *evsel,122 struct perf_sample *sample,123 struct event_key *key);124bool exit_event_end(struct evsel *evsel,125 struct perf_sample *sample,126 struct event_key *key);127void exit_event_decode_key(struct perf_kvm_stat *kvm,128 struct event_key *key,129 char *decode);130 131bool kvm_exit_event(struct evsel *evsel);132bool kvm_entry_event(struct evsel *evsel);133int setup_kvm_events_tp(struct perf_kvm_stat *kvm);134 135#define define_exit_reasons_table(name, symbols) \136 static struct exit_reasons_table name[] = { \137 symbols, { -1, NULL } \138 }139 140/*141 * arch specific callbacks and data structures142 */143int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid);144 145extern const char *kvm_events_tp[];146extern struct kvm_reg_events_ops kvm_reg_events_ops[];147extern const char * const kvm_skip_events[];148extern const char *vcpu_id_str;149extern const char *kvm_exit_reason;150extern const char *kvm_entry_trace;151extern const char *kvm_exit_trace;152 153static inline struct kvm_info *kvm_info__get(struct kvm_info *ki)154{155 if (ki)156 refcount_inc(&ki->refcnt);157 return ki;158}159 160static inline void kvm_info__put(struct kvm_info *ki)161{162 if (ki && refcount_dec_and_test(&ki->refcnt))163 free(ki);164}165 166static inline void __kvm_info__zput(struct kvm_info **ki)167{168 kvm_info__put(*ki);169 *ki = NULL;170}171 172#define kvm_info__zput(ki) __kvm_info__zput(&ki)173 174static inline struct kvm_info *kvm_info__new(void)175{176 struct kvm_info *ki;177 178 ki = zalloc(sizeof(*ki));179 if (ki)180 refcount_set(&ki->refcnt, 1);181 182 return ki;183}184 185#else /* HAVE_KVM_STAT_SUPPORT */186// We use this unconditionally in hists__findnew_entry() and hist_entry__delete()187#define kvm_info__zput(ki) do { } while (0)188#endif /* HAVE_KVM_STAT_SUPPORT */189 190extern int kvm_add_default_arch_event(int *argc, const char **argv);191#endif /* __PERF_KVM_STAT_H */192