KVM: x86: push usage of slots_lock down
authorDavid Hildenbrand <david@redhat.com>
Fri, 7 Apr 2017 08:50:29 +0000 (10:50 +0200)
committerRadim Krčmář <rkrcmar@redhat.com>
Wed, 12 Apr 2017 18:17:14 +0000 (20:17 +0200)
Let's just move it to the place where it is actually needed.

Signed-off-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
arch/x86/kvm/i8259.c
arch/x86/kvm/ioapic.c
arch/x86/kvm/x86.c

index af97c5a1f14247c265cffcf36c761b8c7416375d..2da2b429edcdc7c143f7c435de31ac9766fbe291 100644 (file)
@@ -660,9 +660,11 @@ void kvm_pic_destroy(struct kvm *kvm)
        if (!vpic)
                return;
 
+       mutex_lock(&kvm->slots_lock);
        kvm_io_bus_unregister_dev(vpic->kvm, KVM_PIO_BUS, &vpic->dev_master);
        kvm_io_bus_unregister_dev(vpic->kvm, KVM_PIO_BUS, &vpic->dev_slave);
        kvm_io_bus_unregister_dev(vpic->kvm, KVM_PIO_BUS, &vpic->dev_eclr);
+       mutex_unlock(&kvm->slots_lock);
 
        kvm->arch.vpic = NULL;
        kfree(vpic);
index 10941a6d0e6215ddd3e23970e3e1c36321d25838..6e1d8cbe2fd92854cf8118244315ce2cdaf0d6a4 100644 (file)
@@ -637,7 +637,9 @@ void kvm_ioapic_destroy(struct kvm *kvm)
                return;
 
        cancel_delayed_work_sync(&ioapic->eoi_inject);
+       mutex_lock(&kvm->slots_lock);
        kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, &ioapic->dev);
+       mutex_unlock(&kvm->slots_lock);
        kvm->arch.vioapic = NULL;
        kfree(ioapic);
 }
index 182fea214c4291816c3b3cab9d898fdf2cce5d3c..3046b7f278aedd192bf6879e2166135bcc40fc5f 100644 (file)
@@ -4015,9 +4015,7 @@ long kvm_arch_vm_ioctl(struct file *filp,
 
                r = kvm_ioapic_init(kvm);
                if (r) {
-                       mutex_lock(&kvm->slots_lock);
                        kvm_pic_destroy(kvm);
-                       mutex_unlock(&kvm->slots_lock);
                        goto create_irqchip_unlock;
                }
 
@@ -4027,10 +4025,8 @@ long kvm_arch_vm_ioctl(struct file *filp,
                        kvm->arch.irqchip_mode = KVM_IRQCHIP_NONE;
                        /* Pairs with smp_rmb() when reading irqchip_mode */
                        smp_wmb();
-                       mutex_lock(&kvm->slots_lock);
                        kvm_ioapic_destroy(kvm);
                        kvm_pic_destroy(kvm);
-                       mutex_unlock(&kvm->slots_lock);
                        goto create_irqchip_unlock;
                }
                /* Write kvm->irq_routing before enabling irqchip_in_kernel. */