summaryrefslogtreecommitdiff
path: root/kvm_impl.h
blob: ed198610feac2e0c1a7a68dcc3054975cc710faa (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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 * This header files contains pieces necessary for the illumos implementation of
 * the kvm driver. These definitions should not be exported to userland.
 */
/*
 * GPL HEADER START
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 * GPL HEADER END
 *
 * Copyright 2011 Joyent, Inc. All Rights Reserved.
 */

#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_TRACE(name)							\
	DTRACE_PROBE(kvm__##name);

#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) */
	kstat_named_t kvmvs_zonename;		/* vcpu zone name */
} 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 */
	kstat_named_t kvmks_mmu_unsync_page;	/* number of unsynced pages */
	kstat_named_t kvmks_zonename;		/* zone this is running in */
} 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