From: Joerg Roedel <[email protected]>

Make sure the handling of IOAPIC EOIs is aware of planes.

Signed-off-by: Joerg Roedel <[email protected]>
---
 arch/x86/include/asm/kvm_host.h |  2 +-
 arch/x86/kvm/irq.c              |  3 ++-
 arch/x86/kvm/x86.c              | 10 ++++++++--
 3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 1393566741a0..134bc02962fd 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -109,7 +109,7 @@
 #define KVM_REQ_APIC_PAGE_RELOAD \
        KVM_ARCH_REQ_FLAGS(17, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
 #define KVM_REQ_HV_CRASH               KVM_ARCH_REQ(18)
-#define KVM_REQ_IOAPIC_EOI_EXIT                KVM_ARCH_REQ(19)
+#define KVM_REQ_IOAPIC_EOI_EXIT                KVM_ARCH_PLANE_REQ(19)
 #define KVM_REQ_HV_RESET               KVM_ARCH_REQ(20)
 #define KVM_REQ_HV_EXIT                        KVM_ARCH_REQ(21)
 #define KVM_REQ_HV_STIMER              KVM_ARCH_REQ(22)
diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c
index 90e2d2db2123..bc748a4b7cbd 100644
--- a/arch/x86/kvm/irq.c
+++ b/arch/x86/kvm/irq.c
@@ -400,7 +400,8 @@ void kvm_scan_ioapic_routes(struct kvm_vcpu *vcpu,
                hlist_for_each_entry(entry, &table->map[i], link) {
                        struct kvm_lapic_irq irq;
 
-                       if (entry->type != KVM_IRQ_ROUTING_MSI)
+                       if (entry->type != KVM_IRQ_ROUTING_MSI ||
+                           entry->msi.plane_level != vcpu->plane_level)
                                continue;
 
                        kvm_msi_to_lapic_irq(vcpu->kvm, entry, &irq);
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 623838885753..a158740a6fc1 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -11336,8 +11336,14 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
                                goto out;
                        }
                }
-               if (kvm_check_request(KVM_REQ_SCAN_IOAPIC, vcpu))
-                       vcpu_scan_ioapic(vcpu);
+               if (kvm_check_request(KVM_REQ_SCAN_IOAPIC, vcpu)) {
+                       struct kvm_vcpu *v;
+                       unsigned i;
+
+                       vcpu_for_each_plane(vcpu->common, i, v) {
+                               vcpu_scan_ioapic(v);
+                       }
+               }
                if (kvm_check_request(KVM_REQ_LOAD_EOI_EXITMAP, vcpu))
                        vcpu_load_eoi_exitmap(vcpu);
                if (kvm_check_request(KVM_REQ_APIC_PAGE_RELOAD, vcpu))
-- 
2.53.0


Reply via email to