aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2007-10-07 20:50:48 -0400
committerAvi Kivity <avi@qumranet.com>2008-01-30 10:52:50 -0500
commit76fafa5e22bd82e92d2734852ba23f17322d675a (patch)
treef7b81035e86b5b26cbb2d2d13958c805f4990589
parentd589444e924bc72e42fa94853f9096589d69374d (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>
-rw-r--r--drivers/kvm/kvm_main.c10
-rw-r--r--drivers/kvm/svm.c6
-rw-r--r--drivers/kvm/vmx.c6
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
266fail_mmu_destroy:
267 kvm_mmu_destroy(vcpu);
260fail_free_pio_data: 268fail_free_pio_data:
261 free_page((unsigned long)vcpu->pio_data); 269 free_page((unsigned long)vcpu->pio_data);
262fail_free_run: 270fail_free_run:
263 free_page((unsigned long)vcpu->run); 271 free_page((unsigned long)vcpu->run);
264fail: 272fail:
265 return -ENOMEM; 273 return r;
266} 274}
267EXPORT_SYMBOL_GPL(kvm_vcpu_init); 275EXPORT_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;