unsigned long long compMethods; /* bit-wise OR of qemuMigrationCompressMethod */
virBitmapPtr caps;
qemuMigrationParamValue params[QEMU_MIGRATION_PARAM_LAST];
+ virJSONValuePtr blockDirtyBitmapMapping;
};
typedef enum {
"pause-before-switchover",
"late-block-activate",
"multifd",
+ "dirty-bitmaps",
);
}
virBitmapFree(migParams->caps);
+ virJSONValueFree(migParams->blockDirtyBitmapMapping);
g_free(migParams);
}
}
+void
+qemuMigrationParamsSetBlockDirtyBitmapMapping(qemuMigrationParamsPtr migParams,
+ virJSONValuePtr *params)
+{
+ virJSONValueFree(migParams->blockDirtyBitmapMapping);
+ migParams->blockDirtyBitmapMapping = g_steal_pointer(params);
+
+ if (migParams->blockDirtyBitmapMapping)
+ ignore_value(virBitmapSetBit(migParams->caps, QEMU_MIGRATION_CAP_BLOCK_DIRTY_BITMAPS));
+ else
+ ignore_value(virBitmapClearBit(migParams->caps, QEMU_MIGRATION_CAP_BLOCK_DIRTY_BITMAPS));
+}
+
+
qemuMigrationParamsPtr
qemuMigrationParamsFromFlags(virTypedParameterPtr params,
int nparams,
return NULL;
}
+ if (migParams->blockDirtyBitmapMapping) {
+ g_autoptr(virJSONValue) mapping = virJSONValueCopy(migParams->blockDirtyBitmapMapping);
+
+ if (!mapping)
+ return NULL;
+
+ if (virJSONValueObjectAppend(params, "block-bitmap-mapping", mapping) < 0)
+ return NULL;
+ mapping = NULL;
+ }
+
return g_steal_pointer(¶ms);
}
goto cleanup;
qemuMigrationParamsResetTLS(driver, vm, asyncJob, origParams, apiFlags);
+ /* We don't reset 'block-bitmap-mapping' as it can't be unset */
cleanup:
virErrorRestore(&err);
QEMU_MIGRATION_CAP_PAUSE_BEFORE_SWITCHOVER,
QEMU_MIGRATION_CAP_LATE_BLOCK_ACTIVATE,
QEMU_MIGRATION_CAP_MULTIFD,
+ QEMU_MIGRATION_CAP_BLOCK_DIRTY_BITMAPS,
QEMU_MIGRATION_CAP_LAST
} qemuMigrationCapability;
qemuMigrationParam param,
unsigned long long *value);
+void
+qemuMigrationParamsSetBlockDirtyBitmapMapping(qemuMigrationParamsPtr migParams,
+ virJSONValuePtr *params);
+
int
qemuMigrationParamsCheck(virQEMUDriverPtr driver,
virDomainObjPtr vm,