From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kiszka Subject: [PATCH] pci-assign: Fall back to host-side MSI if INTx sharing fails Date: Mon, 19 Mar 2012 10:56:06 +0100 Message-ID: <4F6702B6.4030003@siemens.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: kvm , Alex Williamson , Wen Congyang , Markus Armbruster To: Avi Kivity , Marcelo Tosatti Return-path: Received: from goliath.siemens.de ([192.35.17.28]:29578 "EHLO goliath.siemens.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758720Ab2CSJ4W (ORCPT ); Mon, 19 Mar 2012 05:56:22 -0400 Sender: kvm-owner@vger.kernel.org List-ID: 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 --- 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 " -- 1.7.3.4