Re: [PATCH] pci-assign: Fall back to host-side MSI if INTx sharing fails

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 2012-03-19 at 10:56 +0100, Jan Kiszka wrote:
> If the host or the device does not support INTx sharing, retry the IRQ
> assignment with host-side MSI support enabled but warn about potential
> consequences. This allows to preserve the previous behavior where we
> defaulted to MSI and did not support INTx sharing at all.
> 
> Signed-off-by: Jan Kiszka <jan.kiszka@xxxxxxxxxxx>
> ---
> 
> Detecting if the user actually specified prefer_msi=off as property of
> pci-assign is non-trivial. So I decided to go for the retry approach,
> ignoring potential user requests. The warning should attract the
> attention.
> 
>  hw/device-assignment.c |   12 ++++++++++++
>  1 files changed, 12 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/device-assignment.c b/hw/device-assignment.c
> index 89823f1..c953713 100644
> --- a/hw/device-assignment.c
> +++ b/hw/device-assignment.c
> @@ -835,6 +835,7 @@ static int assign_irq(AssignedDevice *dev)
>          dev->irq_requested_type = 0;
>      }
>  
> +retry:
>      assigned_irq_data.flags = KVM_DEV_IRQ_GUEST_INTX;
>      if (dev->features & ASSIGNED_DEVICE_PREFER_MSI_MASK &&
>          dev->cap.available & ASSIGNED_DEVICE_CAP_MSI)
> @@ -844,6 +845,17 @@ static int assign_irq(AssignedDevice *dev)
>  
>      r = kvm_assign_irq(kvm_state, &assigned_irq_data);
>      if (r < 0) {
> +        if (r == -EIO && !(dev->features & ASSIGNED_DEVICE_PREFER_MSI_MASK) &&
> +            dev->cap.available & ASSIGNED_DEVICE_CAP_MSI) {
> +            /* Retry with host-side MSI. There might be an IRQ conflict and
> +             * either the kernel or the device doesn't support sharing. */
> +            fprintf(stderr,
> +                    "Host-side INTx sharing not supported, "
> +                    "using MSI instead.\n"
> +                    "Some devices do not to work properly in this mode.\n");
> +            dev->features |= ASSIGNED_DEVICE_PREFER_MSI_MASK;
> +            goto retry;
> +        }
>          fprintf(stderr, "Failed to assign irq for \"%s\": %s\n",
>                  dev->dev.qdev.id, strerror(-r));
>          fprintf(stderr, "Perhaps you are assigning a device "

Acked-by: Alex Williamson <alex.williamson@xxxxxxxxxx>

--
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


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux