mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu_migration: Implement VIR_MIGRATE_ZEROCOPY flag
Resolves: https://gitlab.com/libvirt/libvirt/-/issues/306 Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
efa3baeae7
commit
d375993ab3
@ -2634,6 +2634,12 @@ qemuMigrationSrcBeginPhase(virQEMUDriver *driver,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flags & VIR_MIGRATE_ZEROCOPY && !(flags & VIR_MIGRATE_PARALLEL)) {
|
||||||
|
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
|
_("zero-copy is only available for parallel migration"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (flags & (VIR_MIGRATE_NON_SHARED_DISK | VIR_MIGRATE_NON_SHARED_INC)) {
|
if (flags & (VIR_MIGRATE_NON_SHARED_DISK | VIR_MIGRATE_NON_SHARED_INC)) {
|
||||||
if (flags & VIR_MIGRATE_NON_SHARED_SYNCHRONOUS_WRITES &&
|
if (flags & VIR_MIGRATE_NON_SHARED_SYNCHRONOUS_WRITES &&
|
||||||
!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) {
|
!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) {
|
||||||
@ -4798,6 +4804,21 @@ qemuMigrationSrcRun(virQEMUDriver *driver,
|
|||||||
migParams) < 0)
|
migParams) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
if (flags & VIR_MIGRATE_ZEROCOPY) {
|
||||||
|
/* Zero-copy requires pages in transfer to be locked in host memory.
|
||||||
|
* Unfortunately, we have no reliable way of computing how many pages
|
||||||
|
* will need to be locked at the same time. Thus we set the limit to
|
||||||
|
* the whole guest memory and reset it back once migration is done. */
|
||||||
|
unsigned long long limit;
|
||||||
|
|
||||||
|
if (virMemoryLimitIsSet(vm->def->mem.hard_limit))
|
||||||
|
limit = vm->def->mem.hard_limit;
|
||||||
|
else
|
||||||
|
limit = virDomainDefGetMemoryTotal(vm->def);
|
||||||
|
|
||||||
|
if (qemuDomainSetMaxMemLock(vm, limit << 10, &priv->preMigrationMemlock) < 0)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (storageMigration) {
|
if (storageMigration) {
|
||||||
if (mig->nbd) {
|
if (mig->nbd) {
|
||||||
|
@ -61,6 +61,7 @@
|
|||||||
VIR_MIGRATE_PARALLEL | \
|
VIR_MIGRATE_PARALLEL | \
|
||||||
VIR_MIGRATE_NON_SHARED_SYNCHRONOUS_WRITES | \
|
VIR_MIGRATE_NON_SHARED_SYNCHRONOUS_WRITES | \
|
||||||
VIR_MIGRATE_POSTCOPY_RESUME | \
|
VIR_MIGRATE_POSTCOPY_RESUME | \
|
||||||
|
VIR_MIGRATE_ZEROCOPY | \
|
||||||
0)
|
0)
|
||||||
|
|
||||||
/* All supported migration parameters and their types. */
|
/* All supported migration parameters and their types. */
|
||||||
|
@ -94,6 +94,7 @@ VIR_ENUM_IMPL(qemuMigrationCapability,
|
|||||||
"multifd",
|
"multifd",
|
||||||
"dirty-bitmaps",
|
"dirty-bitmaps",
|
||||||
"return-path",
|
"return-path",
|
||||||
|
"zero-copy-send",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@ -175,6 +176,11 @@ static const qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMap[] = {
|
|||||||
VIR_MIGRATE_TUNNELLED,
|
VIR_MIGRATE_TUNNELLED,
|
||||||
QEMU_MIGRATION_CAP_RETURN_PATH,
|
QEMU_MIGRATION_CAP_RETURN_PATH,
|
||||||
QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
|
QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
|
||||||
|
|
||||||
|
{QEMU_MIGRATION_FLAG_REQUIRED,
|
||||||
|
VIR_MIGRATE_ZEROCOPY,
|
||||||
|
QEMU_MIGRATION_CAP_ZERO_COPY_SEND,
|
||||||
|
QEMU_MIGRATION_SOURCE},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Translation from VIR_MIGRATE_PARAM_* typed parameters to
|
/* Translation from VIR_MIGRATE_PARAM_* typed parameters to
|
||||||
|
@ -39,6 +39,7 @@ typedef enum {
|
|||||||
QEMU_MIGRATION_CAP_MULTIFD,
|
QEMU_MIGRATION_CAP_MULTIFD,
|
||||||
QEMU_MIGRATION_CAP_BLOCK_DIRTY_BITMAPS,
|
QEMU_MIGRATION_CAP_BLOCK_DIRTY_BITMAPS,
|
||||||
QEMU_MIGRATION_CAP_RETURN_PATH,
|
QEMU_MIGRATION_CAP_RETURN_PATH,
|
||||||
|
QEMU_MIGRATION_CAP_ZERO_COPY_SEND,
|
||||||
|
|
||||||
QEMU_MIGRATION_CAP_LAST
|
QEMU_MIGRATION_CAP_LAST
|
||||||
} qemuMigrationCapability;
|
} qemuMigrationCapability;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user