diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2007-10-07 20:50:48 -0400 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-01-30 10:52:50 -0500 |
commit | 76fafa5e22bd82e92d2734852ba23f17322d675a (patch) | |
tree | f7b81035e86b5b26cbb2d2d13958c805f4990589 /drivers/kvm | |
parent | d589444e924bc72e42fa94853f9096589d69374d (diff) |
KVM: Hoist kvm_create_lapic() into kvm_vcpu_init()
Move kvm_create_lapic() into kvm_vcpu_init(), rather than having svm
and vmx do it. And make it return the error rather than a fairly
random -ENOMEM.
This also solves the problem that neither svm.c nor vmx.c actually
handles the error path properly.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'drivers/kvm')
-rw-r--r-- | drivers/kvm/kvm_main.c | 10 | ||||
-rw-r--r-- | drivers/kvm/svm.c | 6 | ||||
-rw-r--r-- | drivers/kvm/vmx.c | 6 |
3 files changed, 9 insertions, 13 deletions
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index b19734606cd9..9ea9277014aa 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c | |||
@@ -255,14 +255,22 @@ int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id) | |||
255 | if (r < 0) | 255 | if (r < 0) |
256 | goto fail_free_pio_data; | 256 | goto fail_free_pio_data; |
257 | 257 | ||
258 | if (irqchip_in_kernel(kvm)) { | ||
259 | r = kvm_create_lapic(vcpu); | ||
260 | if (r < 0) | ||
261 | goto fail_mmu_destroy; | ||
262 | } | ||
263 | |||
258 | return 0; | 264 | return 0; |
259 | 265 | ||
266 | fail_mmu_destroy: | ||
267 | kvm_mmu_destroy(vcpu); | ||
260 | fail_free_pio_data: | 268 | fail_free_pio_data: |
261 | free_page((unsigned long)vcpu->pio_data); | 269 | free_page((unsigned long)vcpu->pio_data); |
262 | fail_free_run: | 270 | fail_free_run: |
263 | free_page((unsigned long)vcpu->run); | 271 | free_page((unsigned long)vcpu->run); |
264 | fail: | 272 | fail: |
265 | return -ENOMEM; | 273 | return r; |
266 | } | 274 | } |
267 | EXPORT_SYMBOL_GPL(kvm_vcpu_init); | 275 | EXPORT_SYMBOL_GPL(kvm_vcpu_init); |
268 | 276 | ||
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c index f268bd51f337..fb2e591d5397 100644 --- a/drivers/kvm/svm.c +++ b/drivers/kvm/svm.c | |||
@@ -588,12 +588,6 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id) | |||
588 | if (err) | 588 | if (err) |
589 | goto free_svm; | 589 | goto free_svm; |
590 | 590 | ||
591 | if (irqchip_in_kernel(kvm)) { | ||
592 | err = kvm_create_lapic(&svm->vcpu); | ||
593 | if (err < 0) | ||
594 | goto free_svm; | ||
595 | } | ||
596 | |||
597 | page = alloc_page(GFP_KERNEL); | 591 | page = alloc_page(GFP_KERNEL); |
598 | if (!page) { | 592 | if (!page) { |
599 | err = -ENOMEM; | 593 | err = -ENOMEM; |
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c index 894fd45ecc98..7b742901e783 100644 --- a/drivers/kvm/vmx.c +++ b/drivers/kvm/vmx.c | |||
@@ -2431,12 +2431,6 @@ static struct kvm_vcpu *vmx_create_vcpu(struct kvm *kvm, unsigned int id) | |||
2431 | if (err) | 2431 | if (err) |
2432 | goto free_vcpu; | 2432 | goto free_vcpu; |
2433 | 2433 | ||
2434 | if (irqchip_in_kernel(kvm)) { | ||
2435 | err = kvm_create_lapic(&vmx->vcpu); | ||
2436 | if (err < 0) | ||
2437 | goto free_vcpu; | ||
2438 | } | ||
2439 | |||
2440 | vmx->guest_msrs = kmalloc(PAGE_SIZE, GFP_KERNEL); | 2434 | vmx->guest_msrs = kmalloc(PAGE_SIZE, GFP_KERNEL); |
2441 | if (!vmx->guest_msrs) { | 2435 | if (!vmx->guest_msrs) { |
2442 | err = -ENOMEM; | 2436 | err = -ENOMEM; |