From: Takuya Yoshikawa <yoshikawa.takuya@xxxxxxxxxxxxx> Move slots_lock aquisition from kvm_ioapic_init() and kvm_create_pic() to their caller. As a result, x86's KVM_CREATE_IRQCHIP is now covered by a unified slots_lock section, including kvm_setup_default_irq_routing(). Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@xxxxxxxxxxxxx> --- arch/ia64/kvm/kvm-ia64.c | 2 ++ arch/x86/kvm/i8259.c | 2 -- arch/x86/kvm/x86.c | 6 ++---- virt/kvm/ioapic.c | 2 -- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index 70d224d..060c594 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c @@ -946,7 +946,9 @@ long kvm_arch_vm_ioctl(struct file *filp, } case KVM_CREATE_IRQCHIP: r = -EFAULT; + mutex_lock(&kvm->slots_lock); r = kvm_ioapic_init(kvm); + mutex_unlock(&kvm->slots_lock); if (r) goto out; r = kvm_setup_default_irq_routing(kvm); diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c index f628234..37d24bc 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c @@ -580,9 +580,7 @@ struct kvm_pic *kvm_create_pic(struct kvm *kvm) * Initialize PIO device */ kvm_iodevice_init(&s->dev, &picdev_ops); - mutex_lock(&kvm->slots_lock); ret = kvm_io_bus_register_dev(kvm, KVM_PIO_BUS, &s->dev); - mutex_unlock(&kvm->slots_lock); if (ret < 0) { kfree(s); return NULL; diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 3113aaf..736ab93 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -3300,6 +3300,7 @@ long kvm_arch_vm_ioctl(struct file *filp, struct kvm_pic *vpic; mutex_lock(&kvm->lock); + mutex_lock(&kvm->slots_lock); r = -EEXIST; if (kvm->arch.vpic) goto create_irqchip_unlock; @@ -3308,10 +3309,8 @@ long kvm_arch_vm_ioctl(struct file *filp, if (vpic) { r = kvm_ioapic_init(kvm); if (r) { - mutex_lock(&kvm->slots_lock); kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &vpic->dev); - mutex_unlock(&kvm->slots_lock); kfree(vpic); goto create_irqchip_unlock; } @@ -3322,14 +3321,13 @@ long kvm_arch_vm_ioctl(struct file *filp, smp_wmb(); r = kvm_setup_default_irq_routing(kvm); if (r) { - mutex_lock(&kvm->slots_lock); mutex_lock(&kvm->irq_lock); kvm_ioapic_destroy(kvm); kvm_destroy_pic(kvm); mutex_unlock(&kvm->irq_lock); - mutex_unlock(&kvm->slots_lock); } create_irqchip_unlock: + mutex_unlock(&kvm->slots_lock); mutex_unlock(&kvm->lock); break; } diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index 0b9df83..532bffc 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c @@ -393,9 +393,7 @@ int kvm_ioapic_init(struct kvm *kvm) kvm_ioapic_reset(ioapic); kvm_iodevice_init(&ioapic->dev, &ioapic_mmio_ops); ioapic->kvm = kvm; - mutex_lock(&kvm->slots_lock); ret = kvm_io_bus_register_dev(kvm, KVM_MMIO_BUS, &ioapic->dev); - mutex_unlock(&kvm->slots_lock); if (ret < 0) { kvm->arch.vioapic = NULL; kfree(ioapic); -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html