diff options
| author | Wei Yongjun <yjwei@cn.fujitsu.com> | 2010-02-08 21:33:03 -0500 |
|---|---|---|
| committer | Marcelo Tosatti <mtosatti@redhat.com> | 2010-03-01 10:36:10 -0500 |
| commit | 72bb2fcd23afe8db53b47e8f9edd736c517ba532 (patch) | |
| tree | b79884bcb50077fec7cb5615178cacbbf9e6ce04 /virt | |
| parent | 1ae77badc2504d157800f10a81a58cc9c941e7cb (diff) | |
KVM: cleanup the failure path of KVM_CREATE_IRQCHIP ioctrl
If we fail to init ioapic device or the fail to setup the default irq
routing, the device register by kvm_create_pic() and kvm_ioapic_init()
remain unregister. This patch fixed to do this.
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'virt')
| -rw-r--r-- | virt/kvm/ioapic.c | 11 | ||||
| -rw-r--r-- | virt/kvm/ioapic.h | 1 |
2 files changed, 12 insertions, 0 deletions
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index f3d06934ae6..3db15a807f8 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c | |||
| @@ -401,6 +401,17 @@ int kvm_ioapic_init(struct kvm *kvm) | |||
| 401 | return ret; | 401 | return ret; |
| 402 | } | 402 | } |
| 403 | 403 | ||
| 404 | void kvm_ioapic_destroy(struct kvm *kvm) | ||
| 405 | { | ||
| 406 | struct kvm_ioapic *ioapic = kvm->arch.vioapic; | ||
| 407 | |||
| 408 | if (ioapic) { | ||
| 409 | kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, &ioapic->dev); | ||
| 410 | kvm->arch.vioapic = NULL; | ||
| 411 | kfree(ioapic); | ||
| 412 | } | ||
| 413 | } | ||
| 414 | |||
| 404 | int kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state) | 415 | int kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state) |
| 405 | { | 416 | { |
| 406 | struct kvm_ioapic *ioapic = ioapic_irqchip(kvm); | 417 | struct kvm_ioapic *ioapic = ioapic_irqchip(kvm); |
diff --git a/virt/kvm/ioapic.h b/virt/kvm/ioapic.h index a505ce9054f..8a751b78a43 100644 --- a/virt/kvm/ioapic.h +++ b/virt/kvm/ioapic.h | |||
| @@ -72,6 +72,7 @@ int kvm_apic_match_dest(struct kvm_vcpu *vcpu, struct kvm_lapic *source, | |||
| 72 | int kvm_apic_compare_prio(struct kvm_vcpu *vcpu1, struct kvm_vcpu *vcpu2); | 72 | int kvm_apic_compare_prio(struct kvm_vcpu *vcpu1, struct kvm_vcpu *vcpu2); |
| 73 | void kvm_ioapic_update_eoi(struct kvm *kvm, int vector, int trigger_mode); | 73 | void kvm_ioapic_update_eoi(struct kvm *kvm, int vector, int trigger_mode); |
| 74 | int kvm_ioapic_init(struct kvm *kvm); | 74 | int kvm_ioapic_init(struct kvm *kvm); |
| 75 | void kvm_ioapic_destroy(struct kvm *kvm); | ||
| 75 | int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level); | 76 | int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level); |
| 76 | void kvm_ioapic_reset(struct kvm_ioapic *ioapic); | 77 | void kvm_ioapic_reset(struct kvm_ioapic *ioapic); |
| 77 | int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src, | 78 | int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src, |
