From a72582cb916900d549d93eed939291f624a50071 Mon Sep 17 00:00:00 2001 From: Martin Kletzander Date: Mon, 1 Jul 2013 14:16:51 +0200 Subject: [PATCH] qemu: Allow seamless migration for domains with multiple graphics Since commit 23e8b5d8, the code is refactored in a way that supports domains with multiple graphics elements and commit 37b415200 allows starting such domains. However none of those commits take migration into account. Even though qemu doesn't support relocation for anything else than SPICE and for no more than one graphics, there is no reason to hardcode one graphics into this part of the code as well. --- src/qemu/qemu_migration.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 69d53981a5..49e9e65001 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -427,19 +427,22 @@ qemuMigrationCookieAddGraphics(qemuMigrationCookiePtr mig, virQEMUDriverPtr driver, virDomainObjPtr dom) { + size_t i = 0; + if (mig->flags & QEMU_MIGRATION_COOKIE_GRAPHICS) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Migration graphics data already present")); return -1; } - if (dom->def->ngraphics == 1 && - (dom->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC || - dom->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE)) { - if (!(mig->graphics = - qemuMigrationCookieGraphicsAlloc(driver, dom->def->graphics[0]))) - return -1; - mig->flags |= QEMU_MIGRATION_COOKIE_GRAPHICS; + for (i = 0; i < dom->def->ngraphics; i++) { + if (dom->def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) { + if (!(mig->graphics = + qemuMigrationCookieGraphicsAlloc(driver, dom->def->graphics[i]))) + return -1; + mig->flags |= QEMU_MIGRATION_COOKIE_GRAPHICS; + break; + } } return 0; @@ -1602,11 +1605,16 @@ qemuMigrationWaitForSpice(virQEMUDriverPtr driver, qemuDomainObjPrivatePtr priv = vm->privateData; bool wait_for_spice = false; bool spice_migrated = false; + size_t i = 0; - if (vm->def->ngraphics == 1 && - vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE && - virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SEAMLESS_MIGRATION)) - wait_for_spice = true; + 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 (!wait_for_spice) return 0;