| From 3aacf7df2762738d33cc6b925bc2cc4ee1598a90 Mon Sep 17 00:00:00 2001 |
| From: Peter Xu <peterx@redhat.com> |
| Date: Wed, 15 Mar 2017 16:01:17 +0800 |
| Subject: [PATCH] KVM: x86: clear bus pointer when destroyed |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c |
| index 690d15eaee05..185a8d0e6838 100644 |
| --- a/virt/kvm/kvm_main.c |
| +++ b/virt/kvm/kvm_main.c |
| @@ -718,8 +718,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); |
| @@ -3531,6 +3533,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) { |
| -- |
| 2.12.0 |
| |