QEMU_CAPS_SEAMLESS_MIGRATION capability says QEMU supports
SPICE_MIGRATE_COMPLETED event. Thus we can just drop all code which
polls query-spice and replace it with waiting for the event.
Signed-off-by: Jiri Denemark jdene...@redhat.com
---
Notes:
Version 2:
- new patch
src/qemu/qemu_domain.c | 1 +
src/qemu/qemu_domain.h | 1 +
src/qemu/qemu_migration.c| 38 ++
src/qemu/qemu_monitor.c | 10 -
src/qemu/qemu_monitor.h | 2 --
src/qemu/qemu_monitor_json.c | 49
src/qemu/qemu_process.c | 28 +
tests/qemumonitorjsontest.c | 40
8 files changed, 41 insertions(+), 128 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index a1ce988..fe92a17 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -170,6 +170,7 @@ qemuDomainObjResetAsyncJob(qemuDomainObjPrivatePtr priv)
job-mask = QEMU_JOB_DEFAULT_MASK;
job-dump_memory_only = false;
job-abortJob = false;
+job-spiceMigrated = false;
VIR_FREE(job-current);
}
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 7479f70..55831a5 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -136,6 +136,7 @@ struct qemuDomainJobObj {
qemuDomainJobInfoPtr current; /* async job progress data */
qemuDomainJobInfoPtr completed; /* statistics data of a recently
completed job */
bool abortJob; /* abort of the job requested */
+bool spiceMigrated; /* spice migration completed */
};
typedef void (*qemuDomainCleanupCallback)(virQEMUDriverPtr driver,
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 74c2657..84a66d6 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2375,45 +2375,29 @@ qemuMigrationSetPinAll(virQEMUDriverPtr driver,
}
static int
-qemuMigrationWaitForSpice(virQEMUDriverPtr driver,
- virDomainObjPtr vm)
+qemuMigrationWaitForSpice(virDomainObjPtr vm)
{
qemuDomainObjPrivatePtr priv = vm-privateData;
bool wait_for_spice = false;
-bool spice_migrated = false;
size_t i = 0;
-int rc;
-if (virQEMUCapsGet(priv-qemuCaps, QEMU_CAPS_SEAMLESS_MIGRATION)) {
-for (i = 0; i vm-def-ngraphics; i++) {
-if (vm-def-graphics[i]-type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
-wait_for_spice = true;
-break;
-}
+if (!virQEMUCapsGet(priv-qemuCaps, QEMU_CAPS_SEAMLESS_MIGRATION))
+return 0;
+
+for (i = 0; i vm-def-ngraphics; i++) {
+if (vm-def-graphics[i]-type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
+wait_for_spice = true;
+break;
}
}
if (!wait_for_spice)
return 0;
-while (!spice_migrated) {
-/* Poll every 50ms for progress to allow cancellation */
-struct timespec ts = { .tv_sec = 0, .tv_nsec = 50 * 1000 * 1000ull };
-
-if (qemuDomainObjEnterMonitorAsync(driver, vm,
- QEMU_ASYNC_JOB_MIGRATION_OUT) 0)
+while (!priv-job.spiceMigrated !priv-job.abortJob) {
+if (virDomainObjWait(vm) 0)
return -1;
-
-rc = qemuMonitorGetSpiceMigrationStatus(priv-mon, spice_migrated);
-if (qemuDomainObjExitMonitor(driver, vm) 0)
-return -1;
-if (rc 0)
-return -1;
-virObjectUnlock(vm);
-nanosleep(ts, NULL);
-virObjectLock(vm);
}
-
return 0;
}
@@ -3587,7 +3571,7 @@ qemuMigrationConfirmPhase(virQEMUDriverPtr driver,
if (retcode == 0) {
/* If guest uses SPICE and supports seamless migration we have to hold
* up domain shutdown until SPICE server transfers its data */
-qemuMigrationWaitForSpice(driver, vm);
+qemuMigrationWaitForSpice(vm);
qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_MIGRATED,
VIR_QEMU_PROCESS_STOP_MIGRATED);
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 15f7852..a2a8f0d 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -2201,16 +2201,6 @@ qemuMonitorGetMigrationStatus(qemuMonitorPtr mon,
int
-qemuMonitorGetSpiceMigrationStatus(qemuMonitorPtr mon,
- bool *spice_migrated)
-{
-QEMU_CHECK_MONITOR_JSON(mon);
-
-return qemuMonitorJSONGetSpiceMigrationStatus(mon, spice_migrated);
-}
-
-
-int
qemuMonitorMigrateToFd(qemuMonitorPtr mon,
unsigned int flags,
int fd)
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 86da7ad..17b7003 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -498,8 +498,6 @@ struct _qemuMonitorMigrationStatus {
int qemuMonitorGetMigrationStatus(qemuMonitorPtr mon,