diff options
| author | Jan Kiszka <jan.kiszka@siemens.com> | 2010-11-09 17:02:49 +0100 | 
|---|---|---|
| committer | Avi Kivity <avi@redhat.com> | 2011-01-12 11:29:09 +0200 | 
| commit | d89f5eff70a31237ffa1e21c51d23ca532110aea (patch) | |
| tree | 13b47648a564d8382e08d7e5937ea30ff0fb838c /virt | |
| parent | 9d893c6bc177b6ac5a1e937f4fdc359d272d68ff (diff) | |
| download | linux-d89f5eff70a31237ffa1e21c51d23ca532110aea.tar.bz2 | |
KVM: Clean up vm creation and release
IA64 support forces us to abstract the allocation of the kvm structure.
But instead of mixing this up with arch-specific initialization and
doing the same on destruction, split both steps. This allows to move
generic destruction calls into generic code.
It also fixes error clean-up on failures of kvm_create_vm for IA64.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'virt')
| -rw-r--r-- | virt/kvm/kvm_main.c | 19 | 
1 files changed, 13 insertions, 6 deletions
| diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index fce0578eab0e..4023264c4cd5 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -383,11 +383,15 @@ static int kvm_init_mmu_notifier(struct kvm *kvm)  static struct kvm *kvm_create_vm(void)  { -	int r = 0, i; -	struct kvm *kvm = kvm_arch_create_vm(); +	int r, i; +	struct kvm *kvm = kvm_arch_alloc_vm(); -	if (IS_ERR(kvm)) -		goto out; +	if (!kvm) +		return ERR_PTR(-ENOMEM); + +	r = kvm_arch_init_vm(kvm); +	if (r) +		goto out_err_nodisable;  	r = hardware_enable_all();  	if (r) @@ -427,7 +431,7 @@ static struct kvm *kvm_create_vm(void)  	spin_lock(&kvm_lock);  	list_add(&kvm->vm_list, &vm_list);  	spin_unlock(&kvm_lock); -out: +  	return kvm;  out_err: @@ -438,7 +442,7 @@ out_err_nodisable:  	for (i = 0; i < KVM_NR_BUSES; i++)  		kfree(kvm->buses[i]);  	kfree(kvm->memslots); -	kfree(kvm); +	kvm_arch_free_vm(kvm);  	return ERR_PTR(r);  } @@ -512,6 +516,9 @@ static void kvm_destroy_vm(struct kvm *kvm)  	kvm_arch_flush_shadow(kvm);  #endif  	kvm_arch_destroy_vm(kvm); +	kvm_free_physmem(kvm); +	cleanup_srcu_struct(&kvm->srcu); +	kvm_arch_free_vm(kvm);  	hardware_disable_all();  	mmdrop(mm);  } |