diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/kvm/kvm.h | 1 | ||||
-rw-r--r-- | drivers/kvm/kvm_main.c | 11 |
2 files changed, 11 insertions, 1 deletions
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h index 4ccb343b9af..c48cebf8511 100644 --- a/drivers/kvm/kvm.h +++ b/drivers/kvm/kvm.h | |||
@@ -304,6 +304,7 @@ struct kvm { | |||
304 | int memory_config_version; | 304 | int memory_config_version; |
305 | int busy; | 305 | int busy; |
306 | unsigned long rmap_overflow; | 306 | unsigned long rmap_overflow; |
307 | struct list_head vm_list; | ||
307 | }; | 308 | }; |
308 | 309 | ||
309 | struct kvm_stat { | 310 | struct kvm_stat { |
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index 9b79d3451f6..a6cd1c1fe29 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c | |||
@@ -41,6 +41,9 @@ | |||
41 | MODULE_AUTHOR("Qumranet"); | 41 | MODULE_AUTHOR("Qumranet"); |
42 | MODULE_LICENSE("GPL"); | 42 | MODULE_LICENSE("GPL"); |
43 | 43 | ||
44 | static DEFINE_SPINLOCK(kvm_lock); | ||
45 | static LIST_HEAD(vm_list); | ||
46 | |||
44 | struct kvm_arch_ops *kvm_arch_ops; | 47 | struct kvm_arch_ops *kvm_arch_ops; |
45 | struct kvm_stat kvm_stat; | 48 | struct kvm_stat kvm_stat; |
46 | EXPORT_SYMBOL_GPL(kvm_stat); | 49 | EXPORT_SYMBOL_GPL(kvm_stat); |
@@ -230,9 +233,13 @@ static int kvm_dev_open(struct inode *inode, struct file *filp) | |||
230 | struct kvm_vcpu *vcpu = &kvm->vcpus[i]; | 233 | struct kvm_vcpu *vcpu = &kvm->vcpus[i]; |
231 | 234 | ||
232 | mutex_init(&vcpu->mutex); | 235 | mutex_init(&vcpu->mutex); |
236 | vcpu->cpu = -1; | ||
233 | vcpu->kvm = kvm; | 237 | vcpu->kvm = kvm; |
234 | vcpu->mmu.root_hpa = INVALID_PAGE; | 238 | vcpu->mmu.root_hpa = INVALID_PAGE; |
235 | INIT_LIST_HEAD(&vcpu->free_pages); | 239 | INIT_LIST_HEAD(&vcpu->free_pages); |
240 | spin_lock(&kvm_lock); | ||
241 | list_add(&kvm->vm_list, &vm_list); | ||
242 | spin_unlock(&kvm_lock); | ||
236 | } | 243 | } |
237 | filp->private_data = kvm; | 244 | filp->private_data = kvm; |
238 | return 0; | 245 | return 0; |
@@ -292,6 +299,9 @@ static int kvm_dev_release(struct inode *inode, struct file *filp) | |||
292 | { | 299 | { |
293 | struct kvm *kvm = filp->private_data; | 300 | struct kvm *kvm = filp->private_data; |
294 | 301 | ||
302 | spin_lock(&kvm_lock); | ||
303 | list_del(&kvm->vm_list); | ||
304 | spin_unlock(&kvm_lock); | ||
295 | kvm_free_vcpus(kvm); | 305 | kvm_free_vcpus(kvm); |
296 | kvm_free_physmem(kvm); | 306 | kvm_free_physmem(kvm); |
297 | kfree(kvm); | 307 | kfree(kvm); |
@@ -546,7 +556,6 @@ static int kvm_dev_ioctl_create_vcpu(struct kvm *kvm, int n) | |||
546 | FX_IMAGE_ALIGN); | 556 | FX_IMAGE_ALIGN); |
547 | vcpu->guest_fx_image = vcpu->host_fx_image + FX_IMAGE_SIZE; | 557 | vcpu->guest_fx_image = vcpu->host_fx_image + FX_IMAGE_SIZE; |
548 | 558 | ||
549 | vcpu->cpu = -1; /* First load will set up TR */ | ||
550 | r = kvm_arch_ops->vcpu_create(vcpu); | 559 | r = kvm_arch_ops->vcpu_create(vcpu); |
551 | if (r < 0) | 560 | if (r < 0) |
552 | goto out_free_vcpus; | 561 | goto out_free_vcpus; |