From 5d6b2e19fdb63c85e1fd2b5732d5a684ec871111 Mon Sep 17 00:00:00 2001 From: Ankur Arora Date: Fri, 17 Aug 2018 16:52:05 -0700 Subject: [PATCH] kvm/ioapic: mark gsi-2 used in ioapic routing init 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 --- accel/kvm/kvm-all.c | 5 +++++ hw/i386/kvm/ioapic.c | 1 + include/sysemu/kvm.h | 1 + 3 files changed, 7 insertions(+) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index e035a01f0c..db7494fc33 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -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); diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c index e453692199..80e1bf757b 100644 --- a/hw/i386/kvm/ioapic.c +++ b/hw/i386/kvm/ioapic.c @@ -42,6 +42,7 @@ void kvm_pc_setup_irq_routing(bool pci_enabled) } } } + kvm_irqchip_set_gsi(s, 2); kvm_irqchip_commit_routes(s); } } diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h index 2fe9bfcb4d..f8e72aa6e1 100644 --- a/include/sysemu/kvm.h +++ b/include/sysemu/kvm.h @@ -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); -- 2.50.1