On 12/13/21 15:29, Jiri Denemark wrote: > 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@xxxxxxxxxx> > --- > 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 you initialize this variable, then .. > + > + if (item->match == QEMU_MIGRATION_FLAG_REQUIRED) > + match = item->flag; > + else > + match = 0; .. this else branch can be dropped. > > - 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)); > } > } > Michal