aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm
diff options
context:
space:
mode:
authorPeter Xu <peterx@redhat.com>2017-03-15 04:01:17 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-04-08 03:30:34 -0400
commitef46a13b9c4e49db8aeb319ced36f2c6d34e6bad (patch)
treed2f28ec7bd5a6a08c682f03f444d001379c44715 /virt/kvm
parent5289f1ce39a798e46f31db8efc2e3f99eebf73df (diff)
KVM: x86: clear bus pointer when destroyed
commit df630b8c1e851b5e265dc2ca9c87222e342c093b upstream. 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'virt/kvm')
-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 7f9ee2929cfe..edc7591715e4 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -720,8 +720,10 @@ static void kvm_destroy_vm(struct kvm *kvm)
720 list_del(&kvm->vm_list); 720 list_del(&kvm->vm_list);
721 spin_unlock(&kvm_lock); 721 spin_unlock(&kvm_lock);
722 kvm_free_irq_routing(kvm); 722 kvm_free_irq_routing(kvm);
723 for (i = 0; i < KVM_NR_BUSES; i++) 723 for (i = 0; i < KVM_NR_BUSES; i++) {
724 kvm_io_bus_destroy(kvm->buses[i]); 724 kvm_io_bus_destroy(kvm->buses[i]);
725 kvm->buses[i] = NULL;
726 }
725 kvm_coalesced_mmio_free(kvm); 727 kvm_coalesced_mmio_free(kvm);
726#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) 728#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
727 mmu_notifier_unregister(&kvm->mmu_notifier, kvm->mm); 729 mmu_notifier_unregister(&kvm->mmu_notifier, kvm->mm);
@@ -3568,6 +3570,14 @@ int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,
3568 struct kvm_io_bus *new_bus, *bus; 3570 struct kvm_io_bus *new_bus, *bus;
3569 3571
3570 bus = kvm->buses[bus_idx]; 3572 bus = kvm->buses[bus_idx];
3573
3574 /*
3575 * It's possible the bus being released before hand. If so,
3576 * we're done here.
3577 */
3578 if (!bus)
3579 return 0;
3580
3571 r = -ENOENT; 3581 r = -ENOENT;
3572 for (i = 0; i < bus->dev_count; i++) 3582 for (i = 0; i < bus->dev_count; i++)
3573 if (bus->range[i].dev == dev) { 3583 if (bus->range[i].dev == dev) {