mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-28 10:50:23 +03:00
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: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
78be51b3e5
commit
d3ea986af2
@ -3822,10 +3822,13 @@ qemuMigrationSrcPerformNative(virQEMUDriverPtr driver,
|
||||
}
|
||||
}
|
||||
|
||||
if (STRNEQ(uribits->scheme, "rdma"))
|
||||
spec.destType = MIGRATION_DEST_CONNECT_HOST;
|
||||
else
|
||||
/* RDMA and multi-fd migration requires QEMU to connect to the destination
|
||||
* itself.
|
||||
*/
|
||||
if (STREQ(uribits->scheme, "rdma") || (flags & VIR_MIGRATE_PARALLEL))
|
||||
spec.destType = MIGRATION_DEST_HOST;
|
||||
else
|
||||
spec.destType = MIGRATION_DEST_CONNECT_HOST;
|
||||
spec.dest.host.protocol = uribits->scheme;
|
||||
spec.dest.host.name = uribits->server;
|
||||
spec.dest.host.port = uribits->port;
|
||||
|
@ -57,7 +57,9 @@
|
||||
VIR_MIGRATE_AUTO_CONVERGE | \
|
||||
VIR_MIGRATE_RDMA_PIN_ALL | \
|
||||
VIR_MIGRATE_POSTCOPY | \
|
||||
VIR_MIGRATE_TLS)
|
||||
VIR_MIGRATE_TLS | \
|
||||
VIR_MIGRATE_PARALLEL | \
|
||||
0)
|
||||
|
||||
/* All supported migration parameters and their types. */
|
||||
# define QEMU_MIGRATION_PARAMETERS \
|
||||
@ -80,6 +82,7 @@
|
||||
VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL, 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_PARALLEL_CONNECTIONS, VIR_TYPED_PARAM_INT, \
|
||||
NULL
|
||||
|
||||
|
||||
|
@ -86,6 +86,7 @@ VIR_ENUM_IMPL(qemuMigrationCapability, QEMU_MIGRATION_CAP_LAST,
|
||||
"compress",
|
||||
"pause-before-switchover",
|
||||
"late-block-activate",
|
||||
"multifd",
|
||||
);
|
||||
|
||||
|
||||
@ -103,6 +104,7 @@ VIR_ENUM_IMPL(qemuMigrationParam, QEMU_MIGRATION_PARAM_LAST,
|
||||
"block-incremental",
|
||||
"xbzrle-cache-size",
|
||||
"max-postcopy-bandwidth",
|
||||
"multifd-channels",
|
||||
);
|
||||
|
||||
typedef struct _qemuMigrationParamsAlwaysOnItem qemuMigrationParamsAlwaysOnItem;
|
||||
@ -151,6 +153,10 @@ static const qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMap[] = {
|
||||
{VIR_MIGRATE_POSTCOPY,
|
||||
QEMU_MIGRATION_CAP_POSTCOPY,
|
||||
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
|
||||
@ -184,6 +190,10 @@ static const qemuMigrationParamsTPMapItem qemuMigrationParamsTPMap[] = {
|
||||
.unit = 1024 * 1024, /* MiB/s */
|
||||
.param = QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH,
|
||||
.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[] = {
|
||||
@ -199,6 +209,7 @@ static const qemuMigrationParamType qemuMigrationParamTypes[] = {
|
||||
[QEMU_MIGRATION_PARAM_BLOCK_INCREMENTAL] = QEMU_MIGRATION_PARAM_TYPE_BOOL,
|
||||
[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_MULTIFD_CHANNELS] = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||
};
|
||||
verify(ARRAY_CARDINALITY(qemuMigrationParamTypes) == QEMU_MIGRATION_PARAM_LAST);
|
||||
|
||||
@ -535,6 +546,13 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params,
|
||||
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)
|
||||
goto error;
|
||||
|
||||
|
@ -38,6 +38,7 @@ typedef enum {
|
||||
QEMU_MIGRATION_CAP_COMPRESS,
|
||||
QEMU_MIGRATION_CAP_PAUSE_BEFORE_SWITCHOVER,
|
||||
QEMU_MIGRATION_CAP_LATE_BLOCK_ACTIVATE,
|
||||
QEMU_MIGRATION_CAP_MULTIFD,
|
||||
|
||||
QEMU_MIGRATION_CAP_LAST
|
||||
} qemuMigrationCapability;
|
||||
@ -56,6 +57,7 @@ typedef enum {
|
||||
QEMU_MIGRATION_PARAM_BLOCK_INCREMENTAL,
|
||||
QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE,
|
||||
QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH,
|
||||
QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS,
|
||||
|
||||
QEMU_MIGRATION_PARAM_LAST
|
||||
} qemuMigrationParam;
|
||||
|
Loading…
x
Reference in New Issue
Block a user