diff options
Diffstat (limited to 'include/linux/kvm_host.h')
| -rw-r--r-- | include/linux/kvm_host.h | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index b5021db21858..ab428552af8e 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, | |||
| 98 | int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); | 99 | int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); |
| 99 | #endif | 100 | #endif |
| 100 | 101 | ||
| 102 | enum { | ||
| 103 | OUTSIDE_GUEST_MODE, | ||
| 104 | IN_GUEST_MODE, | ||
| 105 | EXITING_GUEST_MODE | ||
| 106 | }; | ||
| 107 | |||
| 101 | struct kvm_vcpu { | 108 | struct 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 | ||
| 152 | static 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 | ||
| 213 | struct kvm { | 227 | struct 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 | ||
| 722 | static inline bool kvm_make_check_request(int req, struct kvm_vcpu *vcpu) | ||
| 723 | { | ||
| 724 | return test_and_set_bit(req, &vcpu->requests); | ||
| 725 | } | ||
| 726 | |||
| 727 | static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu) | 736 | static 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)) { |
