KVM: x86: clear bus pointer when destroyed
authorPeter Xu <peterx@redhat.com>
Wed, 15 Mar 2017 08:01:17 +0000 (16:01 +0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 21 Mar 2017 16:11:18 +0000 (17:11 +0100)
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>
virt/kvm/kvm_main.c

index a17d78759727f352991a97b4c2bed21266657760..7445566fadc1fdd0ce0239ca52278c2f7d1d7f53 100644 (file)
@@ -727,8 +727,10 @@ static void kvm_destroy_vm(struct kvm *kvm)
        list_del(&kvm->vm_list);
        spin_unlock(&kvm_lock);
        kvm_free_irq_routing(kvm);
-       for (i = 0; i < KVM_NR_BUSES; i++)
+       for (i = 0; i < KVM_NR_BUSES; i++) {
                kvm_io_bus_destroy(kvm->buses[i]);
+               kvm->buses[i] = NULL;
+       }
        kvm_coalesced_mmio_free(kvm);
 #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
        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,
        struct kvm_io_bus *new_bus, *bus;
 
        bus = kvm->buses[bus_idx];
+
+       /*
+        * It's possible the bus being released before hand. If so,
+        * we're done here.
+        */
+       if (!bus)
+               return 0;
+
        r = -ENOENT;
        for (i = 0; i < bus->dev_count; i++)
                if (bus->range[i].dev == dev) {