Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/qemu/qemu_migration.c | 16 ++++++++++++++++
src/qemu/qemu_migration.h | 3 ++-
src/qemu/qemu_process.c | 3 +++
3 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 7ccb0ba..296e54e 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2718,6 +2718,7 @@ enum qemuMigrationCompletedFlags {
QEMU_MIGRATION_COMPLETED_CHECK_STORAGE = (1 << 1),
QEMU_MIGRATION_COMPLETED_UPDATE_STATS = (1 << 2),
QEMU_MIGRATION_COMPLETED_POSTCOPY = (1 << 3),
+ QEMU_MIGRATION_COMPLETED_POSTCOPY_AUTO = (1 << 4),
};
/**
@@ -2815,6 +2816,19 @@ qemuMigrationWaitForCompletion(virQEMUDriverPtr driver,
if (rv < 0)
return rv;
+ if (flags & QEMU_MIGRATION_COMPLETED_POSTCOPY_AUTO &&
+ priv->job.postcopyEnabled &&
+ jobInfo->stats.ram_iteration > 1) {
+ flags ^= QEMU_MIGRATION_COMPLETED_POSTCOPY_AUTO;
+
+ VIR_DEBUG("One pre-copy iteration finished; switching to
post-copy");
+ if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
+ return -2;
+ rv = qemuMonitorMigrateStartPostCopy(priv->mon);
+ if (qemuDomainObjExitMonitor(driver, vm) < 0 || rv < 0)
+ return -2;
+ }
+
if (events) {
if (virDomainObjWait(vm) < 0) {
jobInfo->type = VIR_DOMAIN_JOB_FAILED;
@@ -4659,6 +4673,8 @@ qemuMigrationRun(virQEMUDriverPtr driver,
waitFlags |= QEMU_MIGRATION_COMPLETED_CHECK_STORAGE;
if (flags & VIR_MIGRATE_POSTCOPY)
waitFlags |= QEMU_MIGRATION_COMPLETED_POSTCOPY;
+ if (flags & VIR_MIGRATE_POSTCOPY_AFTER_PRECOPY)
+ waitFlags |= QEMU_MIGRATION_COMPLETED_POSTCOPY_AUTO;
rc = qemuMigrationWaitForCompletion(driver, vm,
QEMU_ASYNC_JOB_MIGRATION_OUT,
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index e30b2ec..ccef71b 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -42,7 +42,8 @@
VIR_MIGRATE_ABORT_ON_ERROR | \
VIR_MIGRATE_AUTO_CONVERGE | \
VIR_MIGRATE_RDMA_PIN_ALL | \
- VIR_MIGRATE_POSTCOPY)
+ VIR_MIGRATE_POSTCOPY | \
+ VIR_MIGRATE_POSTCOPY_AFTER_PRECOPY)
/* All supported migration parameters and their types. */
# define QEMU_MIGRATION_PARAMETERS \
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 5ced279..e067c3f 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -1552,6 +1552,9 @@ qemuProcessHandleMigrationPass(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
goto cleanup;
}
+ priv->job.current->stats.ram_iteration = pass;
+ virDomainObjBroadcast(vm);
+
qemuDomainEventQueue(driver,
virDomainEventMigrationIterationNewFromObj(vm, pass));
--
2.7.0