Move the two hooks for MSI delivery to in-kernel irqchips from the MSI layer to a single place: the APIC. Signed-off-by: Jan Kiszka <jan.kiszka@xxxxxxxxxxx> --- hw/apic.c | 24 +++++++++++++++--------- hw/msi.c | 5 ----- hw/msix.c | 5 ----- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/hw/apic.c b/hw/apic.c index 6811ae1..cb6662c 100644 --- a/hw/apic.c +++ b/hw/apic.c @@ -806,15 +806,21 @@ static uint32_t apic_mem_readl(void *opaque, target_phys_addr_t addr) void apic_deliver_msi(MSIMessage *msg, MSIRoutingCache *cache) { - uint8_t dest = - (msg->address & MSI_ADDR_DEST_ID_MASK) >> MSI_ADDR_DEST_ID_SHIFT; - uint8_t vector = - (msg->data & MSI_DATA_VECTOR_MASK) >> MSI_DATA_VECTOR_SHIFT; - uint8_t dest_mode = (msg->address >> MSI_ADDR_DEST_MODE_SHIFT) & 0x1; - uint8_t trigger_mode = (msg->data >> MSI_DATA_TRIGGER_SHIFT) & 0x1; - uint8_t delivery = (msg->data >> MSI_DATA_DELIVERY_MODE_SHIFT) & 0x7; - /* XXX: Ignore redirection hint. */ - apic_deliver_irq(dest, dest_mode, delivery, vector, trigger_mode); + if (kvm_enabled() && kvm_irqchip_in_kernel()) { + if (kvm_set_irq(cache->kvm_gsi, 1, NULL) < 0) { + abort(); + } + } else { + uint8_t dest = + (msg->address & MSI_ADDR_DEST_ID_MASK) >> MSI_ADDR_DEST_ID_SHIFT; + uint8_t vector = + (msg->data & MSI_DATA_VECTOR_MASK) >> MSI_DATA_VECTOR_SHIFT; + uint8_t dest_mode = (msg->address >> MSI_ADDR_DEST_MODE_SHIFT) & 0x1; + uint8_t trigger_mode = (msg->data >> MSI_DATA_TRIGGER_SHIFT) & 0x1; + uint8_t delivery = (msg->data >> MSI_DATA_DELIVERY_MODE_SHIFT) & 0x7; + /* XXX: Ignore redirection hint. */ + apic_deliver_irq(dest, dest_mode, delivery, vector, trigger_mode); + } } static void apic_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val) diff --git a/hw/msi.c b/hw/msi.c index b947104..1328903 100644 --- a/hw/msi.c +++ b/hw/msi.c @@ -355,11 +355,6 @@ void msi_notify(PCIDevice *dev, unsigned int vector) return; } - if (kvm_enabled() && kvm_irqchip_in_kernel()) { - kvm_set_irq(dev->msi_cache[vector].kvm_gsi, 1, NULL); - return; - } - msi_message_from_vector(dev, flags, vector, &msg); MSI_DEV_PRINTF(dev, diff --git a/hw/msix.c b/hw/msix.c index 0be022e..6886255 100644 --- a/hw/msix.c +++ b/hw/msix.c @@ -457,11 +457,6 @@ void msix_notify(PCIDevice *dev, unsigned vector) return; } - if (kvm_enabled() && kvm_irqchip_in_kernel()) { - kvm_set_irq(dev->msix_cache[vector].kvm_gsi, 1, NULL); - return; - } - msix_message_from_vector(dev, vector, &msg); msi_deliver(&msg, &dev->msix_cache[vector]); -- 1.7.3.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html