|
@@ -3919,14 +3919,9 @@ static int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
|
|
goto split_irqchip_unlock;
|
|
goto split_irqchip_unlock;
|
|
if (kvm->created_vcpus)
|
|
if (kvm->created_vcpus)
|
|
goto split_irqchip_unlock;
|
|
goto split_irqchip_unlock;
|
|
- kvm->arch.irqchip_mode = KVM_IRQCHIP_INIT_IN_PROGRESS;
|
|
|
|
r = kvm_setup_empty_irq_routing(kvm);
|
|
r = kvm_setup_empty_irq_routing(kvm);
|
|
- if (r) {
|
|
|
|
- kvm->arch.irqchip_mode = KVM_IRQCHIP_NONE;
|
|
|
|
- /* Pairs with smp_rmb() when reading irqchip_mode */
|
|
|
|
- smp_wmb();
|
|
|
|
|
|
+ if (r)
|
|
goto split_irqchip_unlock;
|
|
goto split_irqchip_unlock;
|
|
- }
|
|
|
|
/* Pairs with irqchip_in_kernel. */
|
|
/* Pairs with irqchip_in_kernel. */
|
|
smp_wmb();
|
|
smp_wmb();
|
|
kvm->arch.irqchip_mode = KVM_IRQCHIP_SPLIT;
|
|
kvm->arch.irqchip_mode = KVM_IRQCHIP_SPLIT;
|
|
@@ -4012,12 +4007,8 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
|
goto create_irqchip_unlock;
|
|
goto create_irqchip_unlock;
|
|
}
|
|
}
|
|
|
|
|
|
- kvm->arch.irqchip_mode = KVM_IRQCHIP_INIT_IN_PROGRESS;
|
|
|
|
r = kvm_setup_default_irq_routing(kvm);
|
|
r = kvm_setup_default_irq_routing(kvm);
|
|
if (r) {
|
|
if (r) {
|
|
- kvm->arch.irqchip_mode = KVM_IRQCHIP_NONE;
|
|
|
|
- /* Pairs with smp_rmb() when reading irqchip_mode */
|
|
|
|
- smp_wmb();
|
|
|
|
kvm_ioapic_destroy(kvm);
|
|
kvm_ioapic_destroy(kvm);
|
|
kvm_pic_destroy(kvm);
|
|
kvm_pic_destroy(kvm);
|
|
goto create_irqchip_unlock;
|
|
goto create_irqchip_unlock;
|