diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c index 26754f03f8..95fd773645 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -1385,10 +1385,10 @@ qemuMigrationParamsParse(xmlXPathContextPtr ctxt, int qemuMigrationCapsCheck(virQEMUDriver *driver, virDomainObj *vm, - int asyncJob) + int asyncJob, + bool reconnect) { qemuDomainObjPrivate *priv = vm->privateData; - g_autoptr(virBitmap) migEvent = NULL; g_autoptr(virJSONValue) json = NULL; g_auto(GStrv) caps = NULL; char **capStr; @@ -1419,22 +1419,24 @@ qemuMigrationCapsCheck(virQEMUDriver *driver, } } - migEvent = virBitmapNew(QEMU_MIGRATION_CAP_LAST); + if (!reconnect) { + g_autoptr(virBitmap) migEvent = virBitmapNew(QEMU_MIGRATION_CAP_LAST); - ignore_value(virBitmapSetBit(migEvent, QEMU_MIGRATION_CAP_EVENTS)); + ignore_value(virBitmapSetBit(migEvent, QEMU_MIGRATION_CAP_EVENTS)); - if (!(json = qemuMigrationCapsToJSON(migEvent, migEvent))) - return -1; + if (!(json = qemuMigrationCapsToJSON(migEvent, migEvent))) + return -1; - if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) - return -1; + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) + return -1; - rc = qemuMonitorSetMigrationCapabilities(priv->mon, &json); + rc = qemuMonitorSetMigrationCapabilities(priv->mon, &json); - qemuDomainObjExitMonitor(vm); + qemuDomainObjExitMonitor(vm); - if (rc < 0) - return -1; + if (rc < 0) + return -1; + } /* Migration events capability must always be enabled, clearing it from * migration capabilities bitmap makes sure it won't be touched anywhere diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h index 4a8815e776..a0909b9f3d 100644 --- a/src/qemu/qemu_migration_params.h +++ b/src/qemu/qemu_migration_params.h @@ -162,7 +162,8 @@ qemuMigrationParamsParse(xmlXPathContextPtr ctxt, int qemuMigrationCapsCheck(virQEMUDriver *driver, virDomainObj *vm, - int asyncJob); + int asyncJob, + bool reconnect); bool qemuMigrationCapsGet(virDomainObj *vm, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 2b16298942..fd4db43a42 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1914,8 +1914,12 @@ qemuProcessInitMonitor(virQEMUDriver *driver, static int -qemuConnectMonitor(virQEMUDriver *driver, virDomainObj *vm, int asyncJob, - bool retry, qemuDomainLogContext *logCtxt) +qemuConnectMonitor(virQEMUDriver *driver, + virDomainObj *vm, + int asyncJob, + bool retry, + qemuDomainLogContext *logCtxt, + bool reconnect) { qemuDomainObjPrivate *priv = vm->privateData; qemuMonitor *mon = NULL; @@ -1968,7 +1972,7 @@ qemuConnectMonitor(virQEMUDriver *driver, virDomainObj *vm, int asyncJob, if (qemuProcessInitMonitor(driver, vm, asyncJob) < 0) return -1; - if (qemuMigrationCapsCheck(driver, vm, asyncJob) < 0) + if (qemuMigrationCapsCheck(driver, vm, asyncJob, reconnect) < 0) return -1; return 0; @@ -2353,7 +2357,7 @@ qemuProcessWaitForMonitor(virQEMUDriver *driver, VIR_DEBUG("Connect monitor to vm=%p name='%s' retry=%d", vm, vm->def->name, retry); - if (qemuConnectMonitor(driver, vm, asyncJob, retry, logCtxt) < 0) + if (qemuConnectMonitor(driver, vm, asyncJob, retry, logCtxt, false) < 0) goto cleanup; /* Try to get the pty path mappings again via the monitor. This is much more @@ -8773,7 +8777,7 @@ qemuProcessReconnect(void *opaque) tryMonReconn = true; /* XXX check PID liveliness & EXE path */ - if (qemuConnectMonitor(driver, obj, VIR_ASYNC_JOB_NONE, retry, NULL) < 0) + if (qemuConnectMonitor(driver, obj, VIR_ASYNC_JOB_NONE, retry, NULL, true) < 0) goto error; priv->machineName = qemuDomainGetMachineName(obj);