[libvirt PATCH 1/2] qemu: Support enabling migration caps unless a flag is used

Jiri Denemark jdenemar at redhat.com
Mon Dec 13 14:29:35 UTC 2021


So far we were enabling specific migration capabilities when a
corresponding API flag is set. We need to generalize our code to be able
to enable some migration capabilities unless a particular API flag is
used.

Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---
 src/qemu/qemu_migration_params.c | 33 +++++++++++++++++++++++---------
 1 file changed, 24 insertions(+), 9 deletions(-)

diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 837ee6d635..dfe0253487 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -47,6 +47,11 @@ typedef enum {
     QEMU_MIGRATION_PARAM_TYPE_STRING,
 } qemuMigrationParamType;
 
+typedef enum {
+    QEMU_MIGRATION_FLAG_REQUIRED,
+    QEMU_MIGRATION_FLAG_FORBIDDEN,
+} qemuMigrationFlagMatch;
+
 typedef struct _qemuMigrationParamValue qemuMigrationParamValue;
 struct _qemuMigrationParamValue {
     bool set;
@@ -119,6 +124,7 @@ struct _qemuMigrationParamsAlwaysOnItem {
 
 typedef struct _qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMapItem;
 struct _qemuMigrationParamsFlagMapItem {
+    qemuMigrationFlagMatch match;
     virDomainMigrateFlags flag;
     qemuMigrationCapability cap;
     int party; /* bit-wise OR of qemuMigrationParty */
@@ -146,19 +152,23 @@ static const qemuMigrationParamsAlwaysOnItem qemuMigrationParamsAlwaysOn[] = {
 
 /* Translation from virDomainMigrateFlags to qemuMigrationCapability. */
 static const qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMap[] = {
-    {VIR_MIGRATE_RDMA_PIN_ALL,
+    {QEMU_MIGRATION_FLAG_REQUIRED,
+     VIR_MIGRATE_RDMA_PIN_ALL,
      QEMU_MIGRATION_CAP_RDMA_PIN_ALL,
      QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
 
-    {VIR_MIGRATE_AUTO_CONVERGE,
+    {QEMU_MIGRATION_FLAG_REQUIRED,
+     VIR_MIGRATE_AUTO_CONVERGE,
      QEMU_MIGRATION_CAP_AUTO_CONVERGE,
      QEMU_MIGRATION_SOURCE},
 
-    {VIR_MIGRATE_POSTCOPY,
+    {QEMU_MIGRATION_FLAG_REQUIRED,
+     VIR_MIGRATE_POSTCOPY,
      QEMU_MIGRATION_CAP_POSTCOPY,
      QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
 
-    {VIR_MIGRATE_PARALLEL,
+    {QEMU_MIGRATION_FLAG_REQUIRED,
+     VIR_MIGRATE_PARALLEL,
      QEMU_MIGRATION_CAP_MULTIFD,
      QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
 };
@@ -553,13 +563,18 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params,
         return NULL;
 
     for (i = 0; i < G_N_ELEMENTS(qemuMigrationParamsFlagMap); i++) {
-        qemuMigrationCapability cap = qemuMigrationParamsFlagMap[i].cap;
+        const qemuMigrationParamsFlagMapItem *item = &qemuMigrationParamsFlagMap[i];
+        int match;
+
+        if (item->match == QEMU_MIGRATION_FLAG_REQUIRED)
+            match = item->flag;
+        else
+            match = 0;
 
-        if (qemuMigrationParamsFlagMap[i].party & party &&
-            flags & qemuMigrationParamsFlagMap[i].flag) {
+        if (item->party & party && (flags & item->flag) == match) {
             VIR_DEBUG("Enabling migration capability '%s'",
-                      qemuMigrationCapabilityTypeToString(cap));
-            ignore_value(virBitmapSetBit(migParams->caps, cap));
+                      qemuMigrationCapabilityTypeToString(item->cap));
+            ignore_value(virBitmapSetBit(migParams->caps, item->cap));
         }
     }
 
-- 
2.34.1




More information about the libvir-list mailing list