qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [RFC 1/5] vfio: introduce a new VFIO region for migration s


From: Yulei Zhang
Subject: [Qemu-devel] [RFC 1/5] vfio: introduce a new VFIO region for migration support
Date: Mon, 26 Jun 2017 08:52:44 -0000

New VFIO region VFIO_PCI_DEVICE_STATE_REGION_INDEX is added to fetch
and restore the pci device status during the live migration.

Signed-off-by: Yulei Zhang <address@hidden>
---
 hw/vfio/pci.c              | 17 +++++++++++++++++
 hw/vfio/pci.h              |  1 +
 linux-headers/linux/vfio.h |  5 ++++-
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 03a3d01..bf2e0ff 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -2360,6 +2360,23 @@ static void vfio_populate_device(VFIOPCIDevice *vdev, 
Error **errp)
         QLIST_INIT(&vdev->bars[i].quirks);
     }
 
+    /* device state region setup */
+    if (vbasedev->flags & VFIO_DEVICE_FLAGS_MIGRATABLE) {
+        char *name = g_strdup_printf("%s BAR %d", vbasedev->name, 
VFIO_PCI_DEVICE_STATE_REGION_INDEX);
+
+        ret = vfio_region_setup(OBJECT(vdev), vbasedev,
+                                &vdev->device_state.region, 
VFIO_PCI_DEVICE_STATE_REGION_INDEX, name);
+        g_free(name);
+
+        if (ret) {
+            error_setg_errno(errp, -ret, "failed to get region %d info",
+                             VFIO_PCI_DEVICE_STATE_REGION_INDEX);
+            return;
+        }
+
+        QLIST_INIT(&vdev->device_state.quirks);
+    }
+
     ret = vfio_get_region_info(vbasedev,
                                VFIO_PCI_CONFIG_REGION_INDEX, &reg_info);
     if (ret) {
diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
index a8366bb..bd98618 100644
--- a/hw/vfio/pci.h
+++ b/hw/vfio/pci.h
@@ -115,6 +115,7 @@ typedef struct VFIOPCIDevice {
     int interrupt; /* Current interrupt type */
     VFIOBAR bars[PCI_NUM_REGIONS - 1]; /* No ROM */
     VFIOVGA *vga; /* 0xa0000, 0x3b0, 0x3c0 */
+    VFIOBAR device_state;
     void *igd_opregion;
     PCIHostDeviceAddress host;
     EventNotifier err_notifier;
diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h
index 531cb2e..c87d05c 100644
--- a/linux-headers/linux/vfio.h
+++ b/linux-headers/linux/vfio.h
@@ -198,6 +198,8 @@ struct vfio_device_info {
 #define VFIO_DEVICE_FLAGS_PCI  (1 << 1)        /* vfio-pci device */
 #define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2)    /* vfio-platform device */
 #define VFIO_DEVICE_FLAGS_AMBA  (1 << 3)       /* vfio-amba device */
+#define VFIO_DEVICE_FLAGS_CCW   (1 << 4)        /* vfio-ccw device */
+#define VFIO_DEVICE_FLAGS_MIGRATABLE (1 << 5)  /* Device supports migrate */
        __u32   num_regions;    /* Max region index + 1 */
        __u32   num_irqs;       /* Max IRQ index + 1 */
 };
@@ -433,7 +435,8 @@ enum {
         * between described ranges are unimplemented.
         */
        VFIO_PCI_VGA_REGION_INDEX,
-       VFIO_PCI_NUM_REGIONS = 9 /* Fixed user ABI, region indexes >=9 use */
+       VFIO_PCI_DEVICE_STATE_REGION_INDEX,
+       VFIO_PCI_NUM_REGIONS = 10 /* Fixed user ABI, region indexes >=9 use */
                                 /* device specific cap to define content. */
 };
 
-- 
2.7.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]