[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 20/40] ivshmem: Leave INTx alone when using MSI-X
From: |
Markus Armbruster |
Subject: |
[Qemu-devel] [PULL 20/40] ivshmem: Leave INTx alone when using MSI-X |
Date: |
Fri, 18 Mar 2016 18:01:07 +0100 |
The ivshmem device can either use MSI-X or legacy INTx for interrupts.
With MSI-X enabled, peer interrupt events trigger an MSI as they
should. But software can still raise INTx via interrupt status and
mask register in BAR 0. This is explicitly prohibited by PCI Local
Bus Specification Revision 3.0, section 6.8.3.3:
While enabled for MSI or MSI-X operation, a function is prohibited
from using its INTx# pin (if implemented) to request service (MSI,
MSI-X, and INTx# are mutually exclusive).
Fix the device model to leave INTx alone when using MSI-X.
Document that we claim to use INTx in config space even when we don't.
Unlike other devices, ivshmem does *not* use INTx when configured for
MSI-X and MSI-X isn't enabled by software.
Signed-off-by: Markus Armbruster <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
Reviewed-by: Paolo Bonzini <address@hidden>
Message-Id: <address@hidden>
---
hw/misc/ivshmem.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index abcb1c1..65e3a76 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -126,6 +126,11 @@ static void ivshmem_update_irq(IVShmemState *s)
PCIDevice *d = PCI_DEVICE(s);
uint32_t isr = s->intrstatus & s->intrmask;
+ /* No INTx with msi=on, whether the guest enabled MSI-X or not */
+ if (ivshmem_has_feature(s, IVSHMEM_MSI)) {
+ return;
+ }
+
/* don't print ISR resets */
if (isr) {
IVSHMEM_DPRINTF("Set IRQ to %d (%04x %04x)\n",
@@ -873,6 +878,10 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error
**errp)
pci_conf = dev->config;
pci_conf[PCI_COMMAND] = PCI_COMMAND_IO | PCI_COMMAND_MEMORY;
+ /*
+ * Note: we don't use INTx with IVSHMEM_MSI at all, so this is a
+ * bald-faced lie then. But it's a backwards compatible lie.
+ */
pci_config_set_interrupt_pin(pci_conf, 1);
memory_region_init_io(&s->ivshmem_mmio, OBJECT(s), &ivshmem_mmio_ops, s,
--
2.4.3
- [Qemu-devel] [PULL 08/40] ivshmem-test: Clean up wait for devices to become operational, (continued)
- [Qemu-devel] [PULL 08/40] ivshmem-test: Clean up wait for devices to become operational, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 01/40] target-ppc: Document TOCTTOU in hugepage support, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 05/40] event_notifier: Make event_notifier_init_fd() #ifdef CONFIG_EVENTFD, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 15/40] ivshmem: Don't destroy the chardev on version mismatch, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 11/40] ivshmem: Add missing newlines to debug printfs, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 22/40] ivshmem: Simplify rejection of invalid peer ID from server, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 18/40] ivshmem: Clean up register callbacks, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 14/40] ivshmem: Drop ivshmem_event() stub, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 24/40] ivshmem: Plug leaks on unplug, fix peer disconnect, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 38/40] ivshmem: Drop ivshmem property x-memdev, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 20/40] ivshmem: Leave INTx alone when using MSI-X,
Markus Armbruster <=
- [Qemu-devel] [PULL 39/40] ivshmem: Require master to have ID zero, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 33/40] ivshmem: Inline check_shm_size() into its only caller, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 26/40] ivshmem: Propagate errors through ivshmem_recv_setup(), Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 10/40] ivshmem: Rewrite specification document, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 32/40] ivshmem: Simplify memory regions for BAR 2 (shared memory), Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 04/40] qemu-doc: Fix ivshmem huge page example, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 29/40] ivshmem: Simplify how we cope with short reads from server, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 19/40] ivshmem: Clean up MSI-X conditions, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 35/40] ivshmem: Replace int role_val by OnOffAuto master, Markus Armbruster, 2016/03/18
- [Qemu-devel] [PULL 13/40] ivshmem: Clean up after commit 9940c32, Markus Armbruster, 2016/03/18