summaryrefslogtreecommitdiffstats
path: root/hw
diff options
context:
space:
mode:
authorKirti Wankhede2020-10-26 10:36:16 +0100
committerAlex Williamson2020-11-01 20:30:50 +0100
commit050c588c2ef6edd75769e6c4869d0ad625d5be90 (patch)
tree4869831773a6bd95832fdd993ff01609ad903b08 /hw
parentvfio: Add VM state change handler to know state of VM (diff)
downloadqemu-050c588c2ef6edd75769e6c4869d0ad625d5be90.tar.gz
qemu-050c588c2ef6edd75769e6c4869d0ad625d5be90.tar.xz
qemu-050c588c2ef6edd75769e6c4869d0ad625d5be90.zip
vfio: Add migration state change notifier
Added migration state change notifier to get notification on migration state change. These states are translated to VFIO device state and conveyed to vendor driver. Signed-off-by: Kirti Wankhede <kwankhede@nvidia.com> Reviewed-by: Neo Jia <cjia@nvidia.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Diffstat (limited to 'hw')
-rw-r--r--hw/vfio/migration.c28
-rw-r--r--hw/vfio/trace-events1
2 files changed, 29 insertions, 0 deletions
diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c
index e1ffae05e2..7ec85b6469 100644
--- a/hw/vfio/migration.c
+++ b/hw/vfio/migration.c
@@ -175,6 +175,30 @@ static void vfio_vmstate_change(void *opaque, int running, RunState state)
(migration->device_state & mask) | value);
}
+static void vfio_migration_state_notifier(Notifier *notifier, void *data)
+{
+ MigrationState *s = data;
+ VFIOMigration *migration = container_of(notifier, VFIOMigration,
+ migration_state);
+ VFIODevice *vbasedev = migration->vbasedev;
+ int ret;
+
+ trace_vfio_migration_state_notifier(vbasedev->name,
+ MigrationStatus_str(s->state));
+
+ switch (s->state) {
+ case MIGRATION_STATUS_CANCELLING:
+ case MIGRATION_STATUS_CANCELLED:
+ case MIGRATION_STATUS_FAILED:
+ ret = vfio_migration_set_state(vbasedev,
+ ~(VFIO_DEVICE_STATE_SAVING | VFIO_DEVICE_STATE_RESUMING),
+ VFIO_DEVICE_STATE_RUNNING);
+ if (ret) {
+ error_report("%s: Failed to set state RUNNING", vbasedev->name);
+ }
+ }
+}
+
static void vfio_migration_exit(VFIODevice *vbasedev)
{
VFIOMigration *migration = vbasedev->migration;
@@ -219,8 +243,11 @@ static int vfio_migration_init(VFIODevice *vbasedev,
}
migration = vbasedev->migration;
+ migration->vbasedev = vbasedev;
migration->vm_state = qemu_add_vm_change_state_handler(vfio_vmstate_change,
vbasedev);
+ migration->migration_state.notify = vfio_migration_state_notifier;
+ add_migration_state_change_notifier(&migration->migration_state);
return 0;
err:
@@ -270,6 +297,7 @@ void vfio_migration_finalize(VFIODevice *vbasedev)
if (vbasedev->migration) {
VFIOMigration *migration = vbasedev->migration;
+ remove_migration_state_change_notifier(&migration->migration_state);
qemu_del_vm_change_state_handler(migration->vm_state);
vfio_migration_exit(vbasedev);
}
diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events
index 41de81f12f..78d7d83b5e 100644
--- a/hw/vfio/trace-events
+++ b/hw/vfio/trace-events
@@ -150,3 +150,4 @@ vfio_display_edid_write_error(void) ""
vfio_migration_probe(const char *name, uint32_t index) " (%s) Region %d"
vfio_migration_set_state(const char *name, uint32_t state) " (%s) state %d"
vfio_vmstate_change(const char *name, int running, const char *reason, uint32_t dev_state) " (%s) running %d reason %s device state %d"
+vfio_migration_state_notifier(const char *name, const char *state) " (%s) state %s"