summaryrefslogtreecommitdiff
path: root/kvm_impl.h
blob: 02960ca870980cd168edd672fcfb2743cbdf7615 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
 * This header files contains pieces necessary for the illumos implementation of
 * the kvm driver. These definitions should not be exported to userland.
 */
#ifndef	__KVM_IMPL_H
#define	__KVM_IMPL_H

#include <sys/kstat.h>
#include <sys/sdt.h>

#define XXX_KVM_PROBE DTRACE_PROBE2(kvm__xxx, \
	char *, __FILE__, int, __LINE__)
#define XXX_KVM_SYNC_PROBE DTRACE_PROBE2(kvm__xxx__sync, \
	char *, __FILE__, int, __LINE__)

#define	KVM_TRACE1(name, type1, arg1)					\
	DTRACE_PROBE1(kvm__##name, type1, arg1);

#define	KVM_TRACE2(name, type1, arg1, type2, arg2)			\
	DTRACE_PROBE2(kvm__##name, type1, arg1, type2, arg2);

#define	KVM_TRACE3(name, type1, arg1, type2, arg2, type3, arg3)		\
	DTRACE_PROBE3(kvm__##name, type1, arg1, type2, arg2, type3, arg3);

#define	KVM_TRACE4(name, type1, arg1, type2, arg2, type3, arg3,		\
	    type4, arg4)						\
	DTRACE_PROBE4(kvm__##name, type1, arg1, type2, arg2, 		\
	    type3, arg3, type4, arg4);

#define	KVM_TRACE5(name, type1, arg1, type2, arg2, type3, arg3,		\
	    type4, arg4, type5, arg5)					\
	DTRACE_PROBE5(kvm__##name, type1, arg1, type2, arg2, 		\
	    type3, arg3, type4, arg4, type5, arg5);

#define	KVM_TRACE6(name, type1, arg1, type2, arg2, type3, arg3,		\
	    type4, arg4, type5, arg5, type6, arg6)			\
	DTRACE_PROBE6(kvm__##name, type1, arg1, type2, arg2, 		\
	    type3, arg3, type4, arg4, type5, arg5, type6, arg6);

typedef struct kvm_vcpu_stats {
       kstat_named_t kvmvs_id;                 /* instance of associated kvm */
       kstat_named_t kvmvs_nmi_injections;     /* number of NMI injections */
       kstat_named_t kvmvs_irq_injections;     /* number of IRQ injections */
       kstat_named_t kvmvs_fpu_reload;         /* number of FPU reloads */
       kstat_named_t kvmvs_host_state_reload;  /* host state (re)loads */
       kstat_named_t kvmvs_insn_emulation;     /* instruction emulation */
       kstat_named_t kvmvs_insn_emulation_fail; /* emulation failures */
       kstat_named_t kvmvs_exits;              /* total VM exits */
       kstat_named_t kvmvs_halt_exits;         /* exits due to HLT */
       kstat_named_t kvmvs_irq_exits;          /* exits due to IRQ */
       kstat_named_t kvmvs_io_exits;           /* exits due to I/O instrn */
       kstat_named_t kvmvs_mmio_exits;         /* exits due to mem mppd I/O */
       kstat_named_t kvmvs_nmi_window_exits;   /* exits due to NMI window */
       kstat_named_t kvmvs_irq_window_exits;   /* exits due to IRQ window */
       kstat_named_t kvmvs_request_irq_exits;  /* exits due to requested IRQ */
       kstat_named_t kvmvs_signal_exits;       /* exits due to pending sig */
       kstat_named_t kvmvs_halt_wakeup;        /* wakeups from HLT */
       kstat_named_t kvmvs_invlpg;             /* INVLPG instructions */
       kstat_named_t kvmvs_pf_guest;           /* injected guest pagefaults */
       kstat_named_t kvmvs_pf_fixed;           /* fixed pagefaults */
       kstat_named_t kvmvs_hypercalls;         /* hypercalls (VMCALL instrn) */
} kvm_vcpu_stats_t;

#define KVM_VCPU_KSTAT_INIT(vcpu, field, name) \
	kstat_named_init(&((vcpu)->kvcpu_stats.field), name, KSTAT_DATA_UINT64);

#define KVM_VCPU_KSTAT_INC(vcpu, field) \
	(vcpu)->kvcpu_stats.field.value.ui64++;

typedef struct kvm_stats {
       kstat_named_t kvmks_pid;                /* PID of opening process */
       kstat_named_t kvmks_mmu_pte_write;      /* page table entry writes */
       kstat_named_t kvmks_mmu_pte_zapped;     /* zapped page table entries */
       kstat_named_t kvmks_mmu_pte_updated;    /* page table entry updates */
       kstat_named_t kvmks_mmu_flooded;        /* # of pages flooded */
       kstat_named_t kvmks_mmu_cache_miss;     /* misses in page cache */
       kstat_named_t kvmks_mmu_recycled;       /* recycles from free list */
       kstat_named_t kvmks_remote_tlb_flush;   /* remote TLB flushes */
       kstat_named_t kvmks_lpages;             /* large pages in use */
} kvm_stats_t;

#define KVM_KSTAT_INIT(kvmp, field, name) \
	kstat_named_init(&((kvmp)->kvm_stats.field), name, KSTAT_DATA_UINT64);

#define KVM_KSTAT_INC(kvmp, field) \
	(kvmp)->kvm_stats.field.value.ui64++;

#define KVM_KSTAT_DEC(kvmp, field) \
	(kvmp)->kvm_stats.field.value.ui64--;


#ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
#endif /*ARRAY_SIZE*/

#endif