qemu-devel
[Top][All Lists]
Advanced

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

[RFC PATCH 08/13] vfio/migration: split migration handler registering fr


From: Lei Rao
Subject: [RFC PATCH 08/13] vfio/migration: split migration handler registering from vfio_migration_init
Date: Tue, 24 May 2022 14:18:43 +0800

vfio_migration_init() is mainly related to initialization of In-Band approach.
Migration handler registering may also be used by other approaches. so split it
from vfio_migration_init() and move it to vfio_migration_probe().

Signed-off-by: Lei Rao <lei.rao@intel.com>
Reviewed-by: Eddie Dong <eddie.dong@intel.com>
---
 hw/vfio/migration.c | 56 ++++++++++++++++++++++++++++++---------------
 1 file changed, 37 insertions(+), 19 deletions(-)

diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c
index c114fab3a2..0c67ed85f3 100644
--- a/hw/vfio/migration.c
+++ b/hw/vfio/migration.c
@@ -882,6 +882,38 @@ static int vfio_migration_check(VFIODevice *vbasedev)
     return 0;
 }
 
+static int vfio_migration_register_handlers(VFIODevice *vbasedev)
+{
+    Object *obj;
+    char id[256] = "";
+    g_autofree char *path = NULL, *oid = NULL;
+    VFIOMigration *migration = vbasedev->migration;
+
+    obj = vbasedev->ops->vfio_get_object(vbasedev);
+    if (!obj) {
+        return -EINVAL;
+    }
+
+    oid = vmstate_if_get_id(VMSTATE_IF(DEVICE(obj)));
+    if (oid) {
+        path = g_strdup_printf("%s/vfio", oid);
+    } else {
+        path = g_strdup("vfio");
+    }
+    strpadcpy(id, sizeof(id), path, '\0');
+
+    register_savevm_live(id, VMSTATE_INSTANCE_ID_ANY, 1, &savevm_vfio_handlers,
+                         vbasedev);
+
+    migration->vm_state = qdev_add_vm_change_state_handler(vbasedev->dev,
+                                                           vfio_vmstate_change,
+                                                           vbasedev);
+    migration->migration_state.notify = vfio_migration_state_notifier;
+    add_migration_state_change_notifier(&migration->migration_state);
+
+    return 0;
+}
+
 static VFIOMigrationOps vfio_local_method = {
     .save_setup = vfio_migration_save_setup_local,
     .load_setup = vfio_migration_load_setup_local,
@@ -897,9 +929,7 @@ static int vfio_migration_probe_local(VFIODevice *vbasedev)
 {
     int ret;
     Object *obj;
-    char id[256] = "";
     struct vfio_region_info *info = NULL;
-    g_autofree char *path = NULL, *oid = NULL;
     VFIOMigration *migration = vbasedev->migration;
 
     obj = vbasedev->ops->vfio_get_object(vbasedev);
@@ -930,23 +960,6 @@ static int vfio_migration_probe_local(VFIODevice *vbasedev)
         goto err;
     }
 
-    oid = vmstate_if_get_id(VMSTATE_IF(DEVICE(obj)));
-    if (oid) {
-        path = g_strdup_printf("%s/vfio", oid);
-    } else {
-        path = g_strdup("vfio");
-    }
-    strpadcpy(id, sizeof(id), path, '\0');
-
-    register_savevm_live(id, VMSTATE_INSTANCE_ID_ANY, 1, &savevm_vfio_handlers,
-                         vbasedev);
-
-    migration->vm_state = qdev_add_vm_change_state_handler(vbasedev->dev,
-                                                           vfio_vmstate_change,
-                                                           vbasedev);
-    migration->migration_state.notify = vfio_migration_state_notifier;
-    add_migration_state_change_notifier(&migration->migration_state);
-
     trace_vfio_migration_probe_local(vbasedev->name, info->index);
     migration->ops = &vfio_local_method;
     g_free(info);
@@ -982,6 +995,11 @@ int vfio_migration_probe(VFIODevice *vbasedev, Error 
**errp)
         goto add_blocker;
     }
 
+    ret = vfio_migration_register_handlers(vbasedev);
+    if (ret) {
+        goto add_blocker;
+    }
+
     return 0;
 
 add_blocker:
-- 
2.32.0




reply via email to

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