irqchip_in_kernel() tried to save a bit by reusing pic_irqchip(), but it
just complicated the code.
Add kvm->arch.irqchip_kvm that matches kvm->arch.irqchip_split.
(Turning them into an exclusive type would be nicer.)

Signed-off-by: Radim Krčmář <rkrc...@redhat.com>
---
 arch/x86/include/asm/kvm_host.h |  1 +
 arch/x86/kvm/irq.h              | 13 +++++++------
 arch/x86/kvm/x86.c              |  3 ++-
 3 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index bdde80731f49..929228ec2839 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -778,6 +778,7 @@ struct kvm_arch {
 
        u64 disabled_quirks;
 
+       bool irqchip_kvm;
        bool irqchip_split;
        u8 nr_reserved_ioapic_pins;
 
diff --git a/arch/x86/kvm/irq.h b/arch/x86/kvm/irq.h
index 035731eb3897..8536be85d529 100644
--- a/arch/x86/kvm/irq.h
+++ b/arch/x86/kvm/irq.h
@@ -96,15 +96,16 @@ static inline int irqchip_split(struct kvm *kvm)
        return kvm->arch.irqchip_split;
 }
 
+static inline int irqchip_kvm(struct kvm *kvm)
+{
+       return kvm->arch.irqchip_kvm;
+}
+
 static inline int irqchip_in_kernel(struct kvm *kvm)
 {
-       struct kvm_pic *vpic = pic_irqchip(kvm);
-       bool ret;
+       bool ret = irqchip_kvm(kvm) || irqchip_split(kvm);
 
-       ret = (vpic != NULL);
-       ret |= irqchip_split(kvm);
-
-       /* Read vpic before kvm->irq_routing.  */
+       /* Matches with wmb after initializing kvm->irq_routing. */
        smp_rmb();
        return ret;
 }
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index dbed51045c37..dd8431a7e18b 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3928,8 +3928,9 @@ long kvm_arch_vm_ioctl(struct file *filp,
                        mutex_unlock(&kvm->slots_lock);
                        goto create_irqchip_unlock;
                }
-               /* Write kvm->irq_routing before kvm->arch.vpic.  */
+               /* Write kvm->irq_routing before enabling irqchip_in_kernel. */
                smp_wmb();
+               kvm->arch.irqchip_kvm = true;
                kvm->arch.vpic = vpic;
        create_irqchip_unlock:
                mutex_unlock(&kvm->lock);
-- 
2.10.2

Reply via email to