[libvirt] [PATCH v2 7/7] qemu: Use qemuProcessLaunch in migration Prepare phase
Pavel Hrdina
phrdina at redhat.com
Tue Nov 24 09:50:41 UTC 2015
On Thu, Nov 19, 2015 at 01:09:21PM +0100, Jiri Denemark wrote:
> Using qemuProcess{Init,Launch,FinishStartup} allows us to run
> pre-migration commands on destination before asking QEMU to wait for
> incoming migration data.
>
> Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> ---
> src/qemu/qemu_migration.c | 68 ++++++++++++++++++++++++++++++-----------------
> 1 file changed, 44 insertions(+), 24 deletions(-)
>
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index b6525df..fe9b1ff 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -3291,14 +3291,16 @@ qemuMigrationPrepareCleanup(virQEMUDriverPtr driver,
> qemuDomainObjDiscardAsyncJob(driver, vm);
> }
>
> -static char *
> +static qemuProcessIncomingDefPtr
> qemuMigrationPrepareIncoming(virDomainObjPtr vm,
> bool tunnel,
> const char *protocol,
> const char *listenAddress,
> - unsigned short port)
> + unsigned short port,
> + int fd)
> {
> qemuDomainObjPrivatePtr priv = vm->privateData;
> + qemuProcessIncomingDefPtr inc = NULL;
> char *migrateFrom = NULL;
>
> if (tunnel) {
> @@ -3361,8 +3363,11 @@ qemuMigrationPrepareIncoming(virDomainObjPtr vm,
> goto cleanup;
> }
>
> + inc = qemuProcessIncomingDefNew(priv->qemuCaps, migrateFrom, fd, NULL);
> +
> cleanup:
> - return migrateFrom;
> + VIR_FREE(migrateFrom);
> + return inc;
> }
>
> static int
> @@ -3393,8 +3398,11 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
> char *xmlout = NULL;
> unsigned int cookieFlags;
> virCapsPtr caps = NULL;
> - char *migrateFrom = NULL;
> + qemuProcessIncomingDefPtr incoming = NULL;
> bool taint_hook = false;
> + bool stopProcess = false;
> + bool relabel = false;
> + int rv;
>
> virNWFilterReadLockFilterUpdates();
>
> @@ -3528,28 +3536,29 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
> goto stopjob;
> }
>
> - virObjectUnref(priv->qemuCaps);
> - priv->qemuCaps = virQEMUCapsCacheLookupCopy(driver->qemuCapsCache,
> - vm->def->emulator,
> - vm->def->os.machine);
> - if (!priv->qemuCaps)
> + if ((rv = qemuProcessInit(driver, vm, true)) < 0) {
> + if (rv == -1)
> + stopProcess = true;
> goto stopjob;
> + }
> + stopProcess = true;
With the changes in 1/7 and 5/7 this could be simple:
if (qemuProcessInit(driver, vm, true) < 0)
goto endjob/endmigjob/stobjob;
And every other goto will jump to 'stop' to make sure that the qemuProcess is
stopped too.
>
> - if (!(migrateFrom = qemuMigrationPrepareIncoming(vm, tunnel, protocol,
> - listenAddress, port)))
> + if (!(incoming = qemuMigrationPrepareIncoming(vm, tunnel, protocol,
> + listenAddress, port,
> + dataFD[0])))
> goto stopjob;
> + dataFD[0] = -1; /* the FD is now owned by incoming */
>
> - /* Start the QEMU daemon, with the same command-line arguments plus
> - * -incoming $migrateFrom
> - */
> - if (qemuProcessStart(dconn, driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
> - migrateFrom, dataFD[0], NULL, NULL,
> - VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_START,
> - VIR_QEMU_PROCESS_START_PAUSED |
> - VIR_QEMU_PROCESS_START_AUTODESTROY) < 0) {
> - virDomainAuditStart(vm, "migrated", false);
> + rv = qemuProcessLaunch(dconn, driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
> + incoming, NULL,
> + VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_START,
> + VIR_QEMU_PROCESS_START_AUTODESTROY);
> + if (rv < 0) {
> + if (rv == -2)
> + relabel = true;
> goto stopjob;
> }
> + relabel = true;
>
> if (tunnel) {
> if (virFDStreamOpen(st, dataFD[1]) < 0) {
[...]
Otherwise seems ok,
Pavel
More information about the libvir-list
mailing list