summaryrefslogtreecommitdiff
path: root/tools/perf/util/kvm-stat.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/kvm-stat.h')
-rw-r--r--tools/perf/util/kvm-stat.h73
1 files changed, 56 insertions, 17 deletions
diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h
index 6f0fa05b62b6..3e9ac754c3d1 100644
--- a/tools/perf/util/kvm-stat.h
+++ b/tools/perf/util/kvm-stat.h
@@ -5,9 +5,16 @@
#ifdef HAVE_KVM_STAT_SUPPORT
#include "tool.h"
+#include "sort.h"
#include "stat.h"
+#include "symbol.h"
#include "record.h"
+#include <stdlib.h>
+#include <linux/zalloc.h>
+
+#define KVM_EVENT_NAME_LEN 40
+
struct evsel;
struct evlist;
struct perf_session;
@@ -19,15 +26,22 @@ struct event_key {
struct exit_reasons_table *exit_reasons;
};
+struct kvm_info {
+ char name[KVM_EVENT_NAME_LEN];
+ refcount_t refcnt;
+};
+
struct kvm_event_stats {
u64 time;
struct stats stats;
};
+struct perf_kvm_stat;
+
struct kvm_event {
struct list_head hash_entry;
- struct rb_node rb;
+ struct perf_kvm_stat *perf_kvm;
struct event_key key;
struct kvm_event_stats total;
@@ -35,17 +49,10 @@ struct kvm_event {
#define DEFAULT_VCPU_NUM 8
int max_vcpu;
struct kvm_event_stats *vcpu;
-};
-
-typedef int (*key_cmp_fun)(struct kvm_event*, struct kvm_event*, int);
-struct kvm_event_key {
- const char *name;
- key_cmp_fun key;
+ struct hist_entry he;
};
-struct perf_kvm_stat;
-
struct child_event_ops {
void (*get_key)(struct evsel *evsel,
struct perf_sample *sample,
@@ -70,9 +77,6 @@ struct exit_reasons_table {
const char *reason;
};
-#define EVENTS_BITS 12
-#define EVENTS_CACHE_SIZE (1UL << EVENTS_BITS)
-
struct perf_kvm_stat {
struct perf_tool tool;
struct record_opts opts;
@@ -84,12 +88,13 @@ struct perf_kvm_stat {
const char *sort_key;
int trace_vcpu;
+ /* Used when process events */
+ struct addr_location al;
+
struct exit_reasons_table *exit_reasons;
const char *exit_reasons_isa;
struct kvm_events_ops *events_ops;
- key_cmp_fun compare;
- struct list_head kvm_events_cache[EVENTS_CACHE_SIZE];
u64 total_time;
u64 total_count;
@@ -98,12 +103,11 @@ struct perf_kvm_stat {
struct intlist *pid_list;
- struct rb_root result;
-
int timerfd;
unsigned int display_time;
bool live;
bool force;
+ bool use_stdio;
};
struct kvm_reg_events_ops {
@@ -142,10 +146,45 @@ extern const char *kvm_events_tp[];
extern struct kvm_reg_events_ops kvm_reg_events_ops[];
extern const char * const kvm_skip_events[];
extern const char *vcpu_id_str;
-extern const int decode_str_len;
extern const char *kvm_exit_reason;
extern const char *kvm_entry_trace;
extern const char *kvm_exit_trace;
+
+static inline struct kvm_info *kvm_info__get(struct kvm_info *ki)
+{
+ if (ki)
+ refcount_inc(&ki->refcnt);
+ return ki;
+}
+
+static inline void kvm_info__put(struct kvm_info *ki)
+{
+ if (ki && refcount_dec_and_test(&ki->refcnt))
+ free(ki);
+}
+
+static inline void __kvm_info__zput(struct kvm_info **ki)
+{
+ kvm_info__put(*ki);
+ *ki = NULL;
+}
+
+#define kvm_info__zput(ki) __kvm_info__zput(&ki)
+
+static inline struct kvm_info *kvm_info__new(void)
+{
+ struct kvm_info *ki;
+
+ ki = zalloc(sizeof(*ki));
+ if (ki)
+ refcount_set(&ki->refcnt, 1);
+
+ return ki;
+}
+
+#else /* HAVE_KVM_STAT_SUPPORT */
+// We use this unconditionally in hists__findnew_entry() and hist_entry__delete()
+#define kvm_info__zput(ki) do { } while (0)
#endif /* HAVE_KVM_STAT_SUPPORT */
extern int kvm_add_default_arch_event(int *argc, const char **argv);