[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH V3 2/4] vfio: Add vm status change callback to stop/
From: |
Yulei Zhang |
Subject: |
[Qemu-devel] [PATCH V3 2/4] vfio: Add vm status change callback to stop/restart the mdev device |
Date: |
Mon, 5 Mar 2018 14:00:51 +0800 |
VM status change handler is added to change the vfio pci device
status during the migration, write the demanded device status
to the DEVICE STATUS subregion to stop the device on the source side
before fetch its status and start the deivce on the target side
after restore its status.
Signed-off-by: Yulei Zhang <address@hidden>
---
hw/vfio/pci.c | 20 ++++++++++++++++++++
include/hw/vfio/vfio-common.h | 1 +
linux-headers/linux/vfio.h | 3 +++
3 files changed, 24 insertions(+)
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 2fe20e4..3e2289c 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -38,6 +38,7 @@
static void vfio_disable_interrupts(VFIOPCIDevice *vdev);
static void vfio_mmap_set_enabled(VFIOPCIDevice *vdev, bool enabled);
static VMStateDescription vfio_pci_vmstate;
+static void vfio_vm_change_state_handler(void *pv, int running, RunState
state);
/*
* Disabling BAR mmaping can be slow, but toggling it around INTx can
@@ -2880,6 +2881,7 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
vfio_register_err_notifier(vdev);
vfio_register_req_notifier(vdev);
vfio_setup_resetfn_quirk(vdev);
+ qemu_add_vm_change_state_handler(vfio_vm_change_state_handler, vdev);
return;
@@ -2962,6 +2964,24 @@ post_reset:
vfio_pci_post_reset(vdev);
}
+static void vfio_vm_change_state_handler(void *pv, int running, RunState state)
+{
+ VFIOPCIDevice *vdev = pv;
+ VFIODevice *vbasedev = &vdev->vbasedev;
+ uint8_t dev_state;
+ uint8_t sz = 1;
+
+ dev_state = running ? VFIO_DEVICE_START : VFIO_DEVICE_STOP;
+
+ if (pwrite(vdev->vbasedev.fd, &dev_state,
+ sz, vdev->device_state.offset) != sz) {
+ error_report("vfio: Failed to %s device", running ? "start" : "stop");
+ return;
+ }
+
+ vbasedev->device_state = dev_state;
+}
+
static void vfio_instance_init(Object *obj)
{
PCIDevice *pci_dev = PCI_DEVICE(obj);
diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
index f3a2ac9..9c14a8f 100644
--- a/include/hw/vfio/vfio-common.h
+++ b/include/hw/vfio/vfio-common.h
@@ -125,6 +125,7 @@ typedef struct VFIODevice {
unsigned int num_irqs;
unsigned int num_regions;
unsigned int flags;
+ bool device_state;
} VFIODevice;
struct VFIODeviceOps {
diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h
index c3b8e4a..4ddeebc 100644
--- a/linux-headers/linux/vfio.h
+++ b/linux-headers/linux/vfio.h
@@ -303,6 +303,9 @@ struct vfio_region_info_cap_type {
/* Mdev sub-type for device state save and restore */
#define VFIO_REGION_SUBTYPE_DEVICE_STATE (4)
+#define VFIO_DEVICE_START 0
+#define VFIO_DEVICE_STOP 1
+
/**
* VFIO_DEVICE_GET_IRQ_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 9,
* struct vfio_irq_info)
--
2.7.4
- [Qemu-devel] [PATCH V3 0/4] vfio: Introduce Live migration capability to vfio_mdev device, Yulei Zhang, 2018/03/05
- [Qemu-devel] [PATCH V3 2/4] vfio: Add vm status change callback to stop/restart the mdev device,
Yulei Zhang <=
- [Qemu-devel] [PATCH V3 1/4] vfio: introduce a new VFIO subregion for mdev device migration support, Yulei Zhang, 2018/03/05
- [Qemu-devel] [PATCH V3 3/4] vfio: Add struct vfio_vmstate_info to introduce put/get callback funtion for vfio device status save/restore, Yulei Zhang, 2018/03/05
- [Qemu-devel] [PATCH V3 4/4] vifo: introduce new VFIO ioctl VFIO_IOMMU_GET_DIRTY_BITMAP, Yulei Zhang, 2018/03/05
- Re: [Qemu-devel] [PATCH V3 0/4] vfio: Introduce Live migration capability to vfio_mdev device, no-reply, 2018/03/05
- Re: [Qemu-devel] [PATCH V3 0/4] vfio: Introduce Live migration capability to vfio_mdev device, Kirti Wankhede, 2018/03/05