* [Qemu-devel] [PULL 0/2] vfio-pci: Fixes for 1.4 & stable
@ 2013-01-09 19:19 Alex Williamson
2013-01-09 19:19 ` [Qemu-devel] [PATCH 1/2] vfio-pci: Make host MSI-X enable track guest Alex Williamson
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Alex Williamson @ 2013-01-09 19:19 UTC (permalink / raw)
To: aliguori; +Cc: qemu-devel, kvm, qemu-stable
Anthony,
The following changes since commit 560c30b1db1d40fe45c5104185367c4de43399d3:
Merge remote-tracking branch 'kraxel/usb.75' into staging (2013-01-08 10:36:20 -0600)
are available in the git repository at:
git://github.com/awilliam/qemu-vfio.git tags/qemu-1.4-vfio-20130109.0
for you to fetch changes up to 8fc94e5a8046e349e07976f9bcaffbcd5833f3a2:
vfio-pci: Loosen sanity checks to allow future features (2013-01-08 14:10:03 -0700)
----------------------------------------------------------------
vfio-pci: Fixes for qemu 1.4 & stable
----------------------------------------------------------------
Alex Williamson (2):
vfio-pci: Make host MSI-X enable track guest
vfio-pci: Loosen sanity checks to allow future features
hw/vfio_pci.c | 34 ++++++++++++++++++++++++++++------
1 file changed, 28 insertions(+), 6 deletions(-)
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH 1/2] vfio-pci: Make host MSI-X enable track guest
2013-01-09 19:19 [Qemu-devel] [PULL 0/2] vfio-pci: Fixes for 1.4 & stable Alex Williamson
@ 2013-01-09 19:19 ` Alex Williamson
2013-01-09 19:19 ` [Qemu-devel] [PATCH 2/2] vfio-pci: Loosen sanity checks to allow future features Alex Williamson
2013-01-10 20:57 ` [Qemu-devel] [PULL 0/2] vfio-pci: Fixes for 1.4 & stable Anthony Liguori
2 siblings, 0 replies; 4+ messages in thread
From: Alex Williamson @ 2013-01-09 19:19 UTC (permalink / raw)
To: aliguori; +Cc: qemu-devel, kvm, qemu-stable
Guests typically enable MSI-X with all of the vectors in the MSI-X
vector table masked. Only when the vector is enabled does the vector
get unmasked, resulting in a vector_use callback. These two points,
enable and unmask, correspond to pci_enable_msix() and request_irq()
for Linux guests. Some drivers rely on VF/PF or PF/fw communication
channels that expect the physical state of the device to match the
guest visible state of the device. They don't appreciate lazily
enabling MSI-X on the physical device.
To solve this, enable MSI-X with a single vector when the MSI-X
capability is enabled and immediate disable the vector. This leaves
the physical device in exactly the same state between host and guest.
Furthermore, the brief gap where we enable vector 0, it fires into
userspace, not KVM, so the guest doesn't get spurious interrupts.
Ideally we could call VFIO_DEVICE_SET_IRQS with the right parameters
to enable MSI-X with zero vectors, but this will currently return an
error as the Linux MSI-X interfaces do not allow it.
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Cc: qemu-stable@nongnu.org
---
hw/vfio_pci.c | 30 ++++++++++++++++++++++++++----
1 file changed, 26 insertions(+), 4 deletions(-)
diff --git a/hw/vfio_pci.c b/hw/vfio_pci.c
index 28c8303..8ec1faf 100644
--- a/hw/vfio_pci.c
+++ b/hw/vfio_pci.c
@@ -562,8 +562,8 @@ static int vfio_enable_vectors(VFIODevice *vdev, bool msix)
return ret;
}
-static int vfio_msix_vector_use(PCIDevice *pdev,
- unsigned int nr, MSIMessage msg)
+static int vfio_msix_vector_do_use(PCIDevice *pdev, unsigned int nr,
+ MSIMessage *msg, IOHandler *handler)
{
VFIODevice *vdev = DO_UPCAST(VFIODevice, pdev, pdev);
VFIOMSIVector *vector;
@@ -587,7 +587,7 @@ static int vfio_msix_vector_use(PCIDevice *pdev,
* Attempt to enable route through KVM irqchip,
* default to userspace handling if unavailable.
*/
- vector->virq = kvm_irqchip_add_msi_route(kvm_state, msg);
+ vector->virq = msg ? kvm_irqchip_add_msi_route(kvm_state, *msg) : -1;
if (vector->virq < 0 ||
kvm_irqchip_add_irqfd_notifier(kvm_state, &vector->interrupt,
vector->virq) < 0) {
@@ -596,7 +596,7 @@ static int vfio_msix_vector_use(PCIDevice *pdev,
vector->virq = -1;
}
qemu_set_fd_handler(event_notifier_get_fd(&vector->interrupt),
- vfio_msi_interrupt, NULL, vector);
+ handler, NULL, vector);
}
/*
@@ -639,6 +639,12 @@ static int vfio_msix_vector_use(PCIDevice *pdev,
return 0;
}
+static int vfio_msix_vector_use(PCIDevice *pdev,
+ unsigned int nr, MSIMessage msg)
+{
+ return vfio_msix_vector_do_use(pdev, nr, &msg, vfio_msi_interrupt);
+}
+
static void vfio_msix_vector_release(PCIDevice *pdev, unsigned int nr)
{
VFIODevice *vdev = DO_UPCAST(VFIODevice, pdev, pdev);
@@ -697,6 +703,22 @@ static void vfio_enable_msix(VFIODevice *vdev)
vdev->interrupt = VFIO_INT_MSIX;
+ /*
+ * Some communication channels between VF & PF or PF & fw rely on the
+ * physical state of the device and expect that enabling MSI-X from the
+ * guest enables the same on the host. When our guest is Linux, the
+ * guest driver call to pci_enable_msix() sets the enabling bit in the
+ * MSI-X capability, but leaves the vector table masked. We therefore
+ * can't rely on a vector_use callback (from request_irq() in the guest)
+ * to switch the physical device into MSI-X mode because that may come a
+ * long time after pci_enable_msix(). This code enables vector 0 with
+ * triggering to userspace, then immediately release the vector, leaving
+ * the physical device with no vectors enabled, but MSI-X enabled, just
+ * like the guest view.
+ */
+ vfio_msix_vector_do_use(&vdev->pdev, 0, NULL, NULL);
+ vfio_msix_vector_release(&vdev->pdev, 0);
+
if (msix_set_vector_notifiers(&vdev->pdev, vfio_msix_vector_use,
vfio_msix_vector_release, NULL)) {
error_report("vfio: msix_set_vector_notifiers failed\n");
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH 2/2] vfio-pci: Loosen sanity checks to allow future features
2013-01-09 19:19 [Qemu-devel] [PULL 0/2] vfio-pci: Fixes for 1.4 & stable Alex Williamson
2013-01-09 19:19 ` [Qemu-devel] [PATCH 1/2] vfio-pci: Make host MSI-X enable track guest Alex Williamson
@ 2013-01-09 19:19 ` Alex Williamson
2013-01-10 20:57 ` [Qemu-devel] [PULL 0/2] vfio-pci: Fixes for 1.4 & stable Anthony Liguori
2 siblings, 0 replies; 4+ messages in thread
From: Alex Williamson @ 2013-01-09 19:19 UTC (permalink / raw)
To: aliguori; +Cc: qemu-devel, kvm, qemu-stable
VFIO_PCI_NUM_REGIONS and VFIO_PCI_NUM_IRQS should never have been
used in this manner as it locks a specific kernel implementation.
Future features may introduce new regions or interrupt entries
(VGA may add legacy ranges, AER might add an IRQ for error
signalling). Fix this before it gets us into trouble.
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Cc: qemu-stable@nongnu.org
---
hw/vfio_pci.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/hw/vfio_pci.c b/hw/vfio_pci.c
index 8ec1faf..c51ae67 100644
--- a/hw/vfio_pci.c
+++ b/hw/vfio_pci.c
@@ -1837,13 +1837,13 @@ static int vfio_get_device(VFIOGroup *group, const char *name, VFIODevice *vdev)
error_report("Warning, device %s does not support reset\n", name);
}
- if (dev_info.num_regions != VFIO_PCI_NUM_REGIONS) {
+ if (dev_info.num_regions < VFIO_PCI_CONFIG_REGION_INDEX + 1) {
error_report("vfio: unexpected number of io regions %u\n",
dev_info.num_regions);
goto error;
}
- if (dev_info.num_irqs != VFIO_PCI_NUM_IRQS) {
+ if (dev_info.num_irqs < VFIO_PCI_MSIX_IRQ_INDEX + 1) {
error_report("vfio: unexpected number of irqs %u\n", dev_info.num_irqs);
goto error;
}
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PULL 0/2] vfio-pci: Fixes for 1.4 & stable
2013-01-09 19:19 [Qemu-devel] [PULL 0/2] vfio-pci: Fixes for 1.4 & stable Alex Williamson
2013-01-09 19:19 ` [Qemu-devel] [PATCH 1/2] vfio-pci: Make host MSI-X enable track guest Alex Williamson
2013-01-09 19:19 ` [Qemu-devel] [PATCH 2/2] vfio-pci: Loosen sanity checks to allow future features Alex Williamson
@ 2013-01-10 20:57 ` Anthony Liguori
2 siblings, 0 replies; 4+ messages in thread
From: Anthony Liguori @ 2013-01-10 20:57 UTC (permalink / raw)
To: Alex Williamson, aliguori; +Cc: qemu-devel, kvm, qemu-stable
Pulled, thanks.
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-01-10 21:20 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-09 19:19 [Qemu-devel] [PULL 0/2] vfio-pci: Fixes for 1.4 & stable Alex Williamson
2013-01-09 19:19 ` [Qemu-devel] [PATCH 1/2] vfio-pci: Make host MSI-X enable track guest Alex Williamson
2013-01-09 19:19 ` [Qemu-devel] [PATCH 2/2] vfio-pci: Loosen sanity checks to allow future features Alex Williamson
2013-01-10 20:57 ` [Qemu-devel] [PULL 0/2] vfio-pci: Fixes for 1.4 & stable Anthony Liguori
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).