提交 d3ea986a 编写于 作者: J Jiri Denemark

qemu: Add support for parallel migration

The VIR_MIGRATE_PARALLEL flag is implemented using QEMU's multifd
migration capability and the corresponding multifd-channels migration
parameter.
Signed-off-by: NJiri Denemark <jdenemar@redhat.com>
Reviewed-by: NJohn Ferlan <jferlan@redhat.com>
上级 78be51b3
...@@ -3822,10 +3822,13 @@ qemuMigrationSrcPerformNative(virQEMUDriverPtr driver, ...@@ -3822,10 +3822,13 @@ qemuMigrationSrcPerformNative(virQEMUDriverPtr driver,
} }
} }
if (STRNEQ(uribits->scheme, "rdma")) /* RDMA and multi-fd migration requires QEMU to connect to the destination
spec.destType = MIGRATION_DEST_CONNECT_HOST; * itself.
else */
if (STREQ(uribits->scheme, "rdma") || (flags & VIR_MIGRATE_PARALLEL))
spec.destType = MIGRATION_DEST_HOST; spec.destType = MIGRATION_DEST_HOST;
else
spec.destType = MIGRATION_DEST_CONNECT_HOST;
spec.dest.host.protocol = uribits->scheme; spec.dest.host.protocol = uribits->scheme;
spec.dest.host.name = uribits->server; spec.dest.host.name = uribits->server;
spec.dest.host.port = uribits->port; spec.dest.host.port = uribits->port;
......
...@@ -57,7 +57,9 @@ ...@@ -57,7 +57,9 @@
VIR_MIGRATE_AUTO_CONVERGE | \ VIR_MIGRATE_AUTO_CONVERGE | \
VIR_MIGRATE_RDMA_PIN_ALL | \ VIR_MIGRATE_RDMA_PIN_ALL | \
VIR_MIGRATE_POSTCOPY | \ VIR_MIGRATE_POSTCOPY | \
VIR_MIGRATE_TLS) VIR_MIGRATE_TLS | \
VIR_MIGRATE_PARALLEL | \
0)
/* All supported migration parameters and their types. */ /* All supported migration parameters and their types. */
# define QEMU_MIGRATION_PARAMETERS \ # define QEMU_MIGRATION_PARAMETERS \
...@@ -80,6 +82,7 @@ ...@@ -80,6 +82,7 @@
VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL, VIR_TYPED_PARAM_INT, \ VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL, VIR_TYPED_PARAM_INT, \
VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT, VIR_TYPED_PARAM_INT, \ VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT, VIR_TYPED_PARAM_INT, \
VIR_MIGRATE_PARAM_BANDWIDTH_POSTCOPY, VIR_TYPED_PARAM_ULLONG, \ VIR_MIGRATE_PARAM_BANDWIDTH_POSTCOPY, VIR_TYPED_PARAM_ULLONG, \
VIR_MIGRATE_PARAM_PARALLEL_CONNECTIONS, VIR_TYPED_PARAM_INT, \
NULL NULL
......
...@@ -86,6 +86,7 @@ VIR_ENUM_IMPL(qemuMigrationCapability, QEMU_MIGRATION_CAP_LAST, ...@@ -86,6 +86,7 @@ VIR_ENUM_IMPL(qemuMigrationCapability, QEMU_MIGRATION_CAP_LAST,
"compress", "compress",
"pause-before-switchover", "pause-before-switchover",
"late-block-activate", "late-block-activate",
"multifd",
); );
...@@ -103,6 +104,7 @@ VIR_ENUM_IMPL(qemuMigrationParam, QEMU_MIGRATION_PARAM_LAST, ...@@ -103,6 +104,7 @@ VIR_ENUM_IMPL(qemuMigrationParam, QEMU_MIGRATION_PARAM_LAST,
"block-incremental", "block-incremental",
"xbzrle-cache-size", "xbzrle-cache-size",
"max-postcopy-bandwidth", "max-postcopy-bandwidth",
"multifd-channels",
); );
typedef struct _qemuMigrationParamsAlwaysOnItem qemuMigrationParamsAlwaysOnItem; typedef struct _qemuMigrationParamsAlwaysOnItem qemuMigrationParamsAlwaysOnItem;
...@@ -151,6 +153,10 @@ static const qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMap[] = { ...@@ -151,6 +153,10 @@ static const qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMap[] = {
{VIR_MIGRATE_POSTCOPY, {VIR_MIGRATE_POSTCOPY,
QEMU_MIGRATION_CAP_POSTCOPY, QEMU_MIGRATION_CAP_POSTCOPY,
QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION}, QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
{VIR_MIGRATE_PARALLEL,
QEMU_MIGRATION_CAP_MULTIFD,
QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
}; };
/* Translation from VIR_MIGRATE_PARAM_* typed parameters to /* Translation from VIR_MIGRATE_PARAM_* typed parameters to
...@@ -184,6 +190,10 @@ static const qemuMigrationParamsTPMapItem qemuMigrationParamsTPMap[] = { ...@@ -184,6 +190,10 @@ static const qemuMigrationParamsTPMapItem qemuMigrationParamsTPMap[] = {
.unit = 1024 * 1024, /* MiB/s */ .unit = 1024 * 1024, /* MiB/s */
.param = QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH, .param = QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH,
.party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION}, .party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
{.typedParam = VIR_MIGRATE_PARAM_PARALLEL_CONNECTIONS,
.param = QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS,
.party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
}; };
static const qemuMigrationParamType qemuMigrationParamTypes[] = { static const qemuMigrationParamType qemuMigrationParamTypes[] = {
...@@ -199,6 +209,7 @@ static const qemuMigrationParamType qemuMigrationParamTypes[] = { ...@@ -199,6 +209,7 @@ static const qemuMigrationParamType qemuMigrationParamTypes[] = {
[QEMU_MIGRATION_PARAM_BLOCK_INCREMENTAL] = QEMU_MIGRATION_PARAM_TYPE_BOOL, [QEMU_MIGRATION_PARAM_BLOCK_INCREMENTAL] = QEMU_MIGRATION_PARAM_TYPE_BOOL,
[QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE] = QEMU_MIGRATION_PARAM_TYPE_ULL, [QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE] = QEMU_MIGRATION_PARAM_TYPE_ULL,
[QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH] = QEMU_MIGRATION_PARAM_TYPE_ULL, [QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH] = QEMU_MIGRATION_PARAM_TYPE_ULL,
[QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS] = QEMU_MIGRATION_PARAM_TYPE_INT,
}; };
verify(ARRAY_CARDINALITY(qemuMigrationParamTypes) == QEMU_MIGRATION_PARAM_LAST); verify(ARRAY_CARDINALITY(qemuMigrationParamTypes) == QEMU_MIGRATION_PARAM_LAST);
...@@ -535,6 +546,13 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params, ...@@ -535,6 +546,13 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params,
goto error; goto error;
} }
if (migParams->params[QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS].set &&
!(flags & VIR_MIGRATE_PARALLEL)) {
virReportError(VIR_ERR_INVALID_ARG, "%s",
_("Turn parallel migration on to tune it"));
goto error;
}
if (qemuMigrationParamsSetCompression(params, nparams, flags, migParams) < 0) if (qemuMigrationParamsSetCompression(params, nparams, flags, migParams) < 0)
goto error; goto error;
......
...@@ -38,6 +38,7 @@ typedef enum { ...@@ -38,6 +38,7 @@ typedef enum {
QEMU_MIGRATION_CAP_COMPRESS, QEMU_MIGRATION_CAP_COMPRESS,
QEMU_MIGRATION_CAP_PAUSE_BEFORE_SWITCHOVER, QEMU_MIGRATION_CAP_PAUSE_BEFORE_SWITCHOVER,
QEMU_MIGRATION_CAP_LATE_BLOCK_ACTIVATE, QEMU_MIGRATION_CAP_LATE_BLOCK_ACTIVATE,
QEMU_MIGRATION_CAP_MULTIFD,
QEMU_MIGRATION_CAP_LAST QEMU_MIGRATION_CAP_LAST
} qemuMigrationCapability; } qemuMigrationCapability;
...@@ -56,6 +57,7 @@ typedef enum { ...@@ -56,6 +57,7 @@ typedef enum {
QEMU_MIGRATION_PARAM_BLOCK_INCREMENTAL, QEMU_MIGRATION_PARAM_BLOCK_INCREMENTAL,
QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE, QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE,
QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH, QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH,
QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS,
QEMU_MIGRATION_PARAM_LAST QEMU_MIGRATION_PARAM_LAST
} qemuMigrationParam; } qemuMigrationParam;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册