aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/kvm_host.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/kvm_host.h')
-rw-r--r--include/linux/kvm_host.h31
1 files changed, 20 insertions, 11 deletions
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index b5021db2185..ab428552af8 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -43,6 +43,7 @@
43#define KVM_REQ_DEACTIVATE_FPU 10 43#define KVM_REQ_DEACTIVATE_FPU 10
44#define KVM_REQ_EVENT 11 44#define KVM_REQ_EVENT 11
45#define KVM_REQ_APF_HALT 12 45#define KVM_REQ_APF_HALT 12
46#define KVM_REQ_NMI 13
46 47
47#define KVM_USERSPACE_IRQ_SOURCE_ID 0 48#define KVM_USERSPACE_IRQ_SOURCE_ID 0
48 49
@@ -98,23 +99,31 @@ int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn,
98int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); 99int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu);
99#endif 100#endif
100 101
102enum {
103 OUTSIDE_GUEST_MODE,
104 IN_GUEST_MODE,
105 EXITING_GUEST_MODE
106};
107
101struct kvm_vcpu { 108struct kvm_vcpu {
102 struct kvm *kvm; 109 struct kvm *kvm;
103#ifdef CONFIG_PREEMPT_NOTIFIERS 110#ifdef CONFIG_PREEMPT_NOTIFIERS
104 struct preempt_notifier preempt_notifier; 111 struct preempt_notifier preempt_notifier;
105#endif 112#endif
113 int cpu;
106 int vcpu_id; 114 int vcpu_id;
107 struct mutex mutex; 115 int srcu_idx;
108 int cpu; 116 int mode;
109 atomic_t guest_mode;
110 struct kvm_run *run;
111 unsigned long requests; 117 unsigned long requests;
112 unsigned long guest_debug; 118 unsigned long guest_debug;
113 int srcu_idx; 119
120 struct mutex mutex;
121 struct kvm_run *run;
114 122
115 int fpu_active; 123 int fpu_active;
116 int guest_fpu_loaded, guest_xcr0_loaded; 124 int guest_fpu_loaded, guest_xcr0_loaded;
117 wait_queue_head_t wq; 125 wait_queue_head_t wq;
126 struct pid *pid;
118 int sigset_active; 127 int sigset_active;
119 sigset_t sigset; 128 sigset_t sigset;
120 struct kvm_vcpu_stat stat; 129 struct kvm_vcpu_stat stat;
@@ -140,6 +149,11 @@ struct kvm_vcpu {
140 struct kvm_vcpu_arch arch; 149 struct kvm_vcpu_arch arch;
141}; 150};
142 151
152static inline int kvm_vcpu_exiting_guest_mode(struct kvm_vcpu *vcpu)
153{
154 return cmpxchg(&vcpu->mode, IN_GUEST_MODE, EXITING_GUEST_MODE);
155}
156
143/* 157/*
144 * Some of the bitops functions do not support too long bitmaps. 158 * Some of the bitops functions do not support too long bitmaps.
145 * This number must be determined not to exceed such limits. 159 * This number must be determined not to exceed such limits.
@@ -212,7 +226,6 @@ struct kvm_memslots {
212 226
213struct kvm { 227struct kvm {
214 spinlock_t mmu_lock; 228 spinlock_t mmu_lock;
215 raw_spinlock_t requests_lock;
216 struct mutex slots_lock; 229 struct mutex slots_lock;
217 struct mm_struct *mm; /* userspace tied to this vm */ 230 struct mm_struct *mm; /* userspace tied to this vm */
218 struct kvm_memslots *memslots; 231 struct kvm_memslots *memslots;
@@ -223,6 +236,7 @@ struct kvm {
223#endif 236#endif
224 struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; 237 struct kvm_vcpu *vcpus[KVM_MAX_VCPUS];
225 atomic_t online_vcpus; 238 atomic_t online_vcpus;
239 int last_boosted_vcpu;
226 struct list_head vm_list; 240 struct list_head vm_list;
227 struct mutex lock; 241 struct mutex lock;
228 struct kvm_io_bus *buses[KVM_NR_BUSES]; 242 struct kvm_io_bus *buses[KVM_NR_BUSES];
@@ -719,11 +733,6 @@ static inline void kvm_make_request(int req, struct kvm_vcpu *vcpu)
719 set_bit(req, &vcpu->requests); 733 set_bit(req, &vcpu->requests);
720} 734}
721 735
722static inline bool kvm_make_check_request(int req, struct kvm_vcpu *vcpu)
723{
724 return test_and_set_bit(req, &vcpu->requests);
725}
726
727static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu) 736static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu)
728{ 737{
729 if (test_bit(req, &vcpu->requests)) { 738 if (test_bit(req, &vcpu->requests)) {