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(a)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