[libvirt] [PATCH v6 1/5] migration: qemu: add option to select compression methods
Jiri Denemark
jdenemar at redhat.com
Thu Apr 14 12:40:02 UTC 2016
On Thu, Apr 14, 2016 at 13:33:48 +0300, Nikolay Shirokovskiy wrote:
> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
> ---
> include/libvirt/libvirt-domain.h | 9 ++
> src/qemu/qemu_driver.c | 60 +++++++++++---
> src/qemu/qemu_migration.c | 173 +++++++++++++++++++++++++++++++++------
> src/qemu/qemu_migration.h | 27 ++++++
> src/qemu/qemu_monitor.c | 2 +-
> src/qemu/qemu_monitor.h | 1 +
> 6 files changed, 234 insertions(+), 38 deletions(-)
...
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index eaabe58..44e8aa0 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
...
> @@ -12551,22 +12573,32 @@ qemuDomainMigratePerform3(virDomainPtr dom,
> {
> virQEMUDriverPtr driver = dom->conn->privateData;
> virDomainObjPtr vm;
> + qemuMigrationCompressionPtr compression = NULL;
> + int ret = -1;
>
> virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
>
> if (!(vm = qemuDomObjFromDomain(dom)))
> return -1;
s/return -1/goto cleanup/
>
> + if (!(compression = qemuMigrationCompressionParse(NULL, 0, flags)))
> + return -1;
> +
And move this if statement before qemuDomObjFromDomain(), otherwise
you'd need to call virDomainObjEndAPI() here in case of error, which
would be rather ugly.
> if (virDomainMigratePerform3EnsureACL(dom->conn, vm->def) < 0) {
> virDomainObjEndAPI(&vm);
> - return -1;
> + goto cleanup;
> }
>
> - return qemuMigrationPerform(driver, dom->conn, vm, xmlin,
> - dconnuri, uri, NULL, NULL, 0, NULL, 0,
> - cookiein, cookieinlen,
> - cookieout, cookieoutlen,
> - flags, dname, resource, true);
> + ret = qemuMigrationPerform(driver, dom->conn, vm, xmlin,
> + dconnuri, uri, NULL, NULL, 0, NULL, 0,
> + compression,
> + cookiein, cookieinlen,
> + cookieout, cookieoutlen,
> + flags, dname, resource, true);
> +
> + cleanup:
> + VIR_FREE(compression);
> + return ret;
> }
>
> static int
...
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index e72c874..8fe0f0d 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
...
> @@ -6558,3 +6611,71 @@ qemuMigrationErrorReport(virQEMUDriverPtr driver,
> virSetError(err);
> virFreeError(err);
> }
> +
> +/* don't ever pass NULL params with non zero nparams */
> +qemuMigrationCompressionPtr
> +qemuMigrationCompressionParse(virTypedParameterPtr params, int nparams,
> + unsigned long flags)
> +{
> + size_t i;
> + qemuMigrationCompressionPtr compression = NULL;
> +
> + if (VIR_ALLOC(compression) < 0)
> + return NULL;
> +
> + for (i = 0; i < nparams; i++) {
> + int method;
> +
> + if (STRNEQ(params[i].field, VIR_MIGRATE_PARAM_COMPRESSION))
> + continue;
> +
> + if ((method = qemuMigrationCompressMethodTypeFromString(params[i].value.s)) < 0) {
This line is too long.
ACK with the following squashed in:
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index cc8f7de..d813280 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -791,8 +791,9 @@ typedef enum {
* VIR_MIGRATE_PARAM_COMPRESSION:
*
* virDomainMigrate* params multiple field: name of the method used to
- * compress migration traffic. The parameter may be specified multiple times
- * if more than one method should be used.
+ * compress migration traffic. Supported compression methods: xbzrle, mt.
+ * The parameter may be specified multiple times if more than one method
+ * should be used.
*/
# define VIR_MIGRATE_PARAM_COMPRESSION "compression"
diff --git i/src/qemu/qemu_driver.c w/src/qemu/qemu_driver.c
index 44e8aa0..e795062 100644
--- i/src/qemu/qemu_driver.c
+++ w/src/qemu/qemu_driver.c
@@ -12578,12 +12578,12 @@ qemuDomainMigratePerform3(virDomainPtr dom,
virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
- if (!(vm = qemuDomObjFromDomain(dom)))
- return -1;
-
if (!(compression = qemuMigrationCompressionParse(NULL, 0, flags)))
return -1;
+ if (!(vm = qemuDomObjFromDomain(dom)))
+ goto cleanup;
+
if (virDomainMigratePerform3EnsureACL(dom->conn, vm->def) < 0) {
virDomainObjEndAPI(&vm);
goto cleanup;
diff --git i/src/qemu/qemu_migration.c w/src/qemu/qemu_migration.c
index 35b5748..f30fbfb 100644
--- i/src/qemu/qemu_migration.c
+++ w/src/qemu/qemu_migration.c
@@ -3434,7 +3434,7 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver,
if (qemuMigrationSetOption(driver, vm,
QEMU_MONITOR_MIGRATION_CAPS_COMPRESS,
compression->methods &
- (1ULL << QEMU_MIGRATION_COMPRESS_MULTITHREAD),
+ (1ULL << QEMU_MIGRATION_COMPRESS_MT),
job) < 0)
return -1;
@@ -6612,9 +6612,11 @@ qemuMigrationErrorReport(virQEMUDriverPtr driver,
virFreeError(err);
}
+
/* don't ever pass NULL params with non zero nparams */
qemuMigrationCompressionPtr
-qemuMigrationCompressionParse(virTypedParameterPtr params, int nparams,
+qemuMigrationCompressionParse(virTypedParameterPtr params,
+ int nparams,
unsigned long flags)
{
size_t i;
@@ -6629,7 +6631,8 @@ qemuMigrationCompressionParse(virTypedParameterPtr params, int nparams,
if (STRNEQ(params[i].field, VIR_MIGRATE_PARAM_COMPRESSION))
continue;
- if ((method = qemuMigrationCompressMethodTypeFromString(params[i].value.s)) < 0) {
+ method = qemuMigrationCompressMethodTypeFromString(params[i].value.s);
+ if (method < 0) {
virReportError(VIR_ERR_INVALID_ARG,
_("Unsupported compression method '%s'"),
params[i].value.s);
@@ -6659,7 +6662,8 @@ qemuMigrationCompressionParse(virTypedParameterPtr params, int nparams,
int
qemuMigrationCompressionDump(qemuMigrationCompressionPtr compression,
virTypedParameterPtr *params,
- int *nparams, int *maxparams,
+ int *nparams,
+ int *maxparams,
unsigned long *flags)
{
size_t i;
@@ -6669,7 +6673,7 @@ qemuMigrationCompressionDump(qemuMigrationCompressionPtr compression,
return 0;
}
- for (i = QEMU_MIGRATION_COMPRESS_XBZRLE; i < QEMU_MIGRATION_COMPRESS_LAST; ++i) {
+ for (i = 0; i < QEMU_MIGRATION_COMPRESS_LAST; ++i) {
if ((compression->methods & (1ULL << i)) &&
virTypedParamsAddString(params, nparams, maxparams,
VIR_MIGRATE_PARAM_COMPRESSION,
diff --git i/src/qemu/qemu_migration.h w/src/qemu/qemu_migration.h
index cb51ca5..ec5145b 100644
--- i/src/qemu/qemu_migration.h
+++ w/src/qemu/qemu_migration.h
@@ -81,7 +81,7 @@ VIR_ENUM_DECL(qemuMigrationJobPhase)
typedef enum {
QEMU_MIGRATION_COMPRESS_XBZRLE = 0,
- QEMU_MIGRATION_COMPRESS_MULTITHREAD,
+ QEMU_MIGRATION_COMPRESS_MT,
QEMU_MIGRATION_COMPRESS_LAST
} qemuMigrationCompressMethod;
@@ -92,11 +92,13 @@ struct _qemuMigrationCompression {
};
qemuMigrationCompressionPtr
-qemuMigrationCompressionParse(virTypedParameterPtr params, int nparams,
+qemuMigrationCompressionParse(virTypedParameterPtr params,
+ int nparams,
unsigned long flags);
int qemuMigrationCompressionDump(qemuMigrationCompressionPtr compression,
virTypedParameterPtr *params,
- int *nparams, int *maxparams,
+ int *nparams,
+ int *maxparams,
unsigned long *flags);
int qemuMigrationJobStart(virQEMUDriverPtr driver,
More information about the libvir-list
mailing list