On 2011-09-22 05:12, Alex Williamson wrote:
> 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.
Oops. Should we fix this nevertheless in the kernel?
> 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
> ---
>
> 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, 0x);
> }
> /* 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;
> +}
> +
That's not equivalent as it needlessly prevents IRQ support in the
absence of KVM_CAP_ASSIGN_DEV_IRQ.
Let's just fix the core issue and replace the test for
KVM_CAP_DEVICE_MSIX with a test call of KVM_ASSIGN_SET_MSIX_NR, passing
in a NULL struct. If it returns -EFAULT, the IOCTL is known and MSIX is
supported.
Jan
--
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html