qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 0/2] vfio-pci fixes
@ 2015-01-09 16:30 Alex Williamson
  2015-01-09 16:30 ` [Qemu-devel] [PULL 1/2] vfio-pci: Fix BAR size overflow Alex Williamson
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Alex Williamson @ 2015-01-09 16:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.williamson

The following changes since commit 59a0419856c9ed24e9ecd033db092b2e8f81a728:

  hw/ppc/mac_newworld: simplify usb controller creation logic (2015-01-08 17:32:27 +0000)

are available in the git repository at:

  git://github.com/awilliam/qemu-vfio.git tags/vfio-update-20150109.0

for you to fetch changes up to b3e27c3aee8f5a96debfe0346e9c0e3a641a8516:

  vfio-pci: Fix interrupt disabling (2015-01-09 08:50:53 -0700)

----------------------------------------------------------------
VFIO fixes:
- Fix 32bit overflow in handling large PCI BARs (Alex Williamson)
- Fix interrupt shutdown ordering (Alex Williamson)

----------------------------------------------------------------
Alex Williamson (2):
      vfio-pci: Fix BAR size overflow
      vfio-pci: Fix interrupt disabling

 hw/vfio/pci.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Qemu-devel] [PULL 1/2] vfio-pci: Fix BAR size overflow
  2015-01-09 16:30 [Qemu-devel] [PULL 0/2] vfio-pci fixes Alex Williamson
@ 2015-01-09 16:30 ` Alex Williamson
  2015-01-09 16:30 ` [Qemu-devel] [PULL 2/2] vfio-pci: Fix interrupt disabling Alex Williamson
  2015-01-11 18:17 ` [Qemu-devel] [PULL 0/2] vfio-pci fixes Peter Maydell
  2 siblings, 0 replies; 4+ messages in thread
From: Alex Williamson @ 2015-01-09 16:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.williamson

We use an unsigned int when working with the PCI BAR size, which can
obviously overflow if the BAR is 4GB or larger.  This needs to change
to a fixed length uint64_t.  A similar issue is possible, though even
more unlikely, when mapping the region above an MSI-X table.  The
start of the MSI-X vector table must be below 4GB, but the end, and
therefore the start of the next mapping region, could still land at
4GB.

Suggested-by: Nishank Trivedi <nishank.trivedi@netapp.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Reviewed-by: Don Slutz <dslutz@verizon.com>
Tested-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
 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 b4e73d1..b6703c7 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -2301,7 +2301,7 @@ static void vfio_unmap_bar(VFIOPCIDevice *vdev, int nr)
 static void vfio_map_bar(VFIOPCIDevice *vdev, int nr)
 {
     VFIOBAR *bar = &vdev->bars[nr];
-    unsigned size = bar->region.size;
+    uint64_t size = bar->region.size;
     char name[64];
     uint32_t pci_bar;
     uint8_t type;
@@ -2351,7 +2351,7 @@ static void vfio_map_bar(VFIOPCIDevice *vdev, int nr)
     }
 
     if (vdev->msix && vdev->msix->table_bar == nr) {
-        unsigned start;
+        uint64_t start;
 
         start = HOST_PAGE_ALIGN(vdev->msix->table_offset +
                                 (vdev->msix->entries * PCI_MSIX_ENTRY_SIZE));

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [Qemu-devel] [PULL 2/2] vfio-pci: Fix interrupt disabling
  2015-01-09 16:30 [Qemu-devel] [PULL 0/2] vfio-pci fixes Alex Williamson
  2015-01-09 16:30 ` [Qemu-devel] [PULL 1/2] vfio-pci: Fix BAR size overflow Alex Williamson
@ 2015-01-09 16:30 ` Alex Williamson
  2015-01-11 18:17 ` [Qemu-devel] [PULL 0/2] vfio-pci fixes Peter Maydell
  2 siblings, 0 replies; 4+ messages in thread
From: Alex Williamson @ 2015-01-09 16:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: alex.williamson

When disabling MSI/X interrupts the disable functions will leave the
device in INTx mode (when available).  This matches how hardware
operates, INTx is enabled unless MSI/X is enabled (DisINTx is handled
separately).  Therefore when we really want to disable all interrupts,
such as when removing the device, and we start with the device in
MSI/X mode, we need to pass through INTx on our way to being
completely quiesced.

In well behaved situations, the guest driver will have shutdown the
device and it will start vfio_exitfn() in INTx mode, producing the
desired result.  If hot-unplug causes the guest to crash, we may get
the device in MSI/X state, which will leave QEMU with a bogus handler
installed.

Fix this by re-ordering our disable routine so that it should always
finish in VFIO_INT_NONE state, which is what all callers expect.

Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
---
 hw/vfio/pci.c |   21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index b6703c7..014a92c 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -2129,16 +2129,19 @@ static void vfio_pci_write_config(PCIDevice *pdev, uint32_t addr,
  */
 static void vfio_disable_interrupts(VFIOPCIDevice *vdev)
 {
-    switch (vdev->interrupt) {
-    case VFIO_INT_INTx:
-        vfio_disable_intx(vdev);
-        break;
-    case VFIO_INT_MSI:
-        vfio_disable_msi(vdev);
-        break;
-    case VFIO_INT_MSIX:
+    /*
+     * More complicated than it looks.  Disabling MSI/X transitions the
+     * device to INTx mode (if supported).  Therefore we need to first
+     * disable MSI/X and then cleanup by disabling INTx.
+     */
+    if (vdev->interrupt == VFIO_INT_MSIX) {
         vfio_disable_msix(vdev);
-        break;
+    } else if (vdev->interrupt == VFIO_INT_MSI) {
+        vfio_disable_msi(vdev);
+    }
+
+    if (vdev->interrupt == VFIO_INT_INTx) {
+        vfio_disable_intx(vdev);
     }
 }
 

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PULL 0/2] vfio-pci fixes
  2015-01-09 16:30 [Qemu-devel] [PULL 0/2] vfio-pci fixes Alex Williamson
  2015-01-09 16:30 ` [Qemu-devel] [PULL 1/2] vfio-pci: Fix BAR size overflow Alex Williamson
  2015-01-09 16:30 ` [Qemu-devel] [PULL 2/2] vfio-pci: Fix interrupt disabling Alex Williamson
@ 2015-01-11 18:17 ` Peter Maydell
  2 siblings, 0 replies; 4+ messages in thread
From: Peter Maydell @ 2015-01-11 18:17 UTC (permalink / raw)
  To: Alex Williamson; +Cc: QEMU Developers

On 9 January 2015 at 16:30, Alex Williamson <alex.williamson@redhat.com> wrote:
> The following changes since commit 59a0419856c9ed24e9ecd033db092b2e8f81a728:
>
>   hw/ppc/mac_newworld: simplify usb controller creation logic (2015-01-08 17:32:27 +0000)
>
> are available in the git repository at:
>
>   git://github.com/awilliam/qemu-vfio.git tags/vfio-update-20150109.0
>
> for you to fetch changes up to b3e27c3aee8f5a96debfe0346e9c0e3a641a8516:
>
>   vfio-pci: Fix interrupt disabling (2015-01-09 08:50:53 -0700)
>
> ----------------------------------------------------------------
> VFIO fixes:
> - Fix 32bit overflow in handling large PCI BARs (Alex Williamson)
> - Fix interrupt shutdown ordering (Alex Williamson)
>

Applied, thanks.

-- PMM

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-01-11 18:17 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-09 16:30 [Qemu-devel] [PULL 0/2] vfio-pci fixes Alex Williamson
2015-01-09 16:30 ` [Qemu-devel] [PULL 1/2] vfio-pci: Fix BAR size overflow Alex Williamson
2015-01-09 16:30 ` [Qemu-devel] [PULL 2/2] vfio-pci: Fix interrupt disabling Alex Williamson
2015-01-11 18:17 ` [Qemu-devel] [PULL 0/2] vfio-pci fixes Peter Maydell

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