]> www.infradead.org Git - users/dwmw2/qemu.git/commitdiff
kvm/ioapic: mark gsi-2 used in ioapic routing init
authorAnkur Arora <ankur.a.arora@oracle.com>
Fri, 17 Aug 2018 23:52:05 +0000 (16:52 -0700)
committerJoao Martins <joao.m.martins@oracle.com>
Tue, 19 Feb 2019 14:00:57 +0000 (09:00 -0500)
GSI-2/IOAPIC pin-2 is treated specially while initing
IRQ routing: PIC does not use it at all while the IOAPIC
maps virq=0 to pin-2 and does not use GSI-2.
(all other GSIs are identity mapped to pins.)

This results in any later code which allocates a virq
to be assigned GSI-2. This virq is in-turn used to
remap interrupts to HYPERVISOR_CALLBACK_VECTOR (0xf3)
to deliver to the guest.

Ordinarily this would be okay, but if the event delivery is
via direct injection via KVM_REQ_EVENT (without going
through the LAPIC) we see vmentry failure.

This works fine for any other values of GSI.

As a workaround, mark GSI-2 used.

Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com>
accel/kvm/kvm-all.c
hw/i386/kvm/ioapic.c
include/sysemu/kvm.h

index e035a01f0cb78486b63c8f3ca74fae7e20f77004..db7494fc3358fdd7cea01469bc55f078f27e607a 100644 (file)
@@ -987,6 +987,11 @@ static void set_gsi(KVMState *s, unsigned int gsi)
     set_bit(gsi, s->used_gsi_bitmap);
 }
 
+void kvm_irqchip_set_gsi(KVMState *s, unsigned int gsi)
+{
+    set_gsi(s, gsi);
+}
+
 static void clear_gsi(KVMState *s, unsigned int gsi)
 {
     clear_bit(gsi, s->used_gsi_bitmap);
index e4536921994c030807e2f7b349273d482f937250..80e1bf757bc59cef2688ba018924f53d3c52b1b5 100644 (file)
@@ -42,6 +42,7 @@ void kvm_pc_setup_irq_routing(bool pci_enabled)
                 }
             }
         }
+        kvm_irqchip_set_gsi(s, 2);
         kvm_irqchip_commit_routes(s);
     }
 }
index 2fe9bfcb4da9cbf36dacf249347f8f581854a4b6..f8e72aa6e1c71f1645fc4a63d4dc2f2f0080d372 100644 (file)
@@ -496,6 +496,7 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg,
                                  PCIDevice *dev);
 void kvm_irqchip_commit_routes(KVMState *s);
 void kvm_irqchip_release_virq(KVMState *s, int virq);
+void kvm_irqchip_set_gsi(KVMState *s, unsigned int gsi);
 
 int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter);
 int kvm_irqchip_add_hv_sint_route(KVMState *s, uint32_t vcpu, uint32_t sint);