Commit c4525754 added a capability check for KVM_CAP_DEVICE_MSIX, which is unfortunately not exposed, resulting in MSIX never being listed as a capability. This breaks anything depending on MSIX, such as igbvf. Since we can't specifically check for MSIX support and KVM_CAP_ASSIGN_DEV_IRQ indicates more than just MSI, let's just revert c4525754 and replace it with a sanity check that we need KVM_CAP_ASSIGN_DEV_IRQ if the device supports any kind of interrupt (which is still mostly paranoia). Signed-off-by: Alex Williamson <alex.williamson@xxxxxxxxxx> --- hw/device-assignment.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-) diff --git a/hw/device-assignment.c b/hw/device-assignment.c index 93913b3..b5bde68 100644 --- a/hw/device-assignment.c +++ b/hw/device-assignment.c @@ -1189,8 +1189,7 @@ static int assigned_device_pci_cap_init(PCIDevice *pci_dev) /* Expose MSI capability * MSI capability is the 1st capability in capability config */ - pos = pci_find_cap_offset(pci_dev, PCI_CAP_ID_MSI, 0); - if (pos != 0 && kvm_check_extension(kvm_state, KVM_CAP_ASSIGN_DEV_IRQ)) { + if ((pos = pci_find_cap_offset(pci_dev, PCI_CAP_ID_MSI, 0))) { dev->cap.available |= ASSIGNED_DEVICE_CAP_MSI; /* Only 32-bit/no-mask currently supported */ if ((ret = pci_add_capability(pci_dev, PCI_CAP_ID_MSI, pos, 10)) < 0) { @@ -1211,8 +1210,7 @@ static int assigned_device_pci_cap_init(PCIDevice *pci_dev) pci_set_word(pci_dev->wmask + pos + PCI_MSI_DATA_32, 0xffff); } /* Expose MSI-X capability */ - pos = pci_find_cap_offset(pci_dev, PCI_CAP_ID_MSIX, 0); - if (pos != 0 && kvm_check_extension(kvm_state, KVM_CAP_DEVICE_MSIX)) { + if ((pos = pci_find_cap_offset(pci_dev, PCI_CAP_ID_MSIX, 0))) { int bar_nr; uint32_t msix_table_entry; @@ -1606,6 +1604,13 @@ static int assigned_initfn(struct PCIDevice *pci_dev) if (assigned_device_pci_cap_init(pci_dev) < 0) goto out; + if (!kvm_check_extension(kvm_state, KVM_CAP_ASSIGN_DEV_IRQ) && + (dev->cap.available & ASSIGNED_DEVICE_CAP_MSIX || + dev->cap.available & ASSIGNED_DEVICE_CAP_MSI || + assigned_dev_pci_read_byte(pci_dev, PCI_INTERRUPT_PIN) != 0)) { + goto out; + } + /* intercept MSI-X entry page in the MMIO */ if (dev->cap.available & ASSIGNED_DEVICE_CAP_MSIX) if (assigned_dev_register_msix_mmio(dev)) -- 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