aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Xu <peterx@redhat.com>2017-03-15 04:01:17 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2017-03-21 12:11:18 -0400
commitdf630b8c1e851b5e265dc2ca9c87222e342c093b (patch)
treea033e928a091f3d9368da2c6a33e524f4bd62e66
parent3aa53859d23e1b9cf1a60f82a9008e35ef10bd6a (diff)
KVM: x86: clear bus pointer when destroyed
When releasing the bus, let's clear the bus pointers to mark it out. If any further device unregister happens on this bus, we know that we're done if we found the bus being released already. Signed-off-by: Peter Xu <peterx@redhat.com> Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
-rw-r--r--virt/kvm/kvm_main.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index a17d78759727..7445566fadc1 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -727,8 +727,10 @@ static void kvm_destroy_vm(struct kvm *kvm)
727 list_del(&kvm->vm_list); 727 list_del(&kvm->vm_list);
728 spin_unlock(&kvm_lock); 728 spin_unlock(&kvm_lock);
729 kvm_free_irq_routing(kvm); 729 kvm_free_irq_routing(kvm);
730 for (i = 0; i < KVM_NR_BUSES; i++) 730 for (i = 0; i < KVM_NR_BUSES; i++) {
731 kvm_io_bus_destroy(kvm->buses[i]); 731 kvm_io_bus_destroy(kvm->buses[i]);
732 kvm->buses[i] = NULL;
733 }
732 kvm_coalesced_mmio_free(kvm); 734 kvm_coalesced_mmio_free(kvm);
733#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) 735#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
734 mmu_notifier_unregister(&kvm->mmu_notifier, kvm->mm); 736 mmu_notifier_unregister(&kvm->mmu_notifier, kvm->mm);
@@ -3579,6 +3581,14 @@ int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,
3579 struct kvm_io_bus *new_bus, *bus; 3581 struct kvm_io_bus *new_bus, *bus;
3580 3582
3581 bus = kvm->buses[bus_idx]; 3583 bus = kvm->buses[bus_idx];
3584
3585 /*
3586 * It's possible the bus being released before hand. If so,
3587 * we're done here.
3588 */
3589 if (!bus)
3590 return 0;
3591
3582 r = -ENOENT; 3592 r = -ENOENT;
3583 for (i = 0; i < bus->dev_count; i++) 3593 for (i = 0; i < bus->dev_count; i++)
3584 if (bus->range[i].dev == dev) { 3594 if (bus->range[i].dev == dev) {