mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: Tidy up job handling during live migration
During a QEMU live migration several warning messages about job handling could be written to syslog on the destination host: "entering monitor without asking for a nested job is dangerous" The messages are written because the job handling during migration uses hard coded asyncJob values in several places that are incorrect. This patch passes the required asyncJob value around and prevents the warnings as well as any issues that the warnings may be referring to. https://bugzilla.redhat.com/show_bug.cgi?id=1130089 Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com> Signed-off-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
3f03398dbe
commit
f0f9eed843
@ -2497,7 +2497,8 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
int
|
int
|
||||||
qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
|
qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm)
|
virDomainObjPtr vm,
|
||||||
|
int asyncJob)
|
||||||
{
|
{
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
char **aliases;
|
char **aliases;
|
||||||
@ -2505,7 +2506,8 @@ qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
|
|||||||
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_DEL_EVENT))
|
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_DEL_EVENT))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
qemuDomainObjEnterMonitor(driver, vm);
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
|
return -1;
|
||||||
if (qemuMonitorGetDeviceAliases(priv->mon, &aliases) < 0) {
|
if (qemuMonitorGetDeviceAliases(priv->mon, &aliases) < 0) {
|
||||||
qemuDomainObjExitMonitor(driver, vm);
|
qemuDomainObjExitMonitor(driver, vm);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -369,7 +369,7 @@ extern virDomainXMLNamespace virQEMUDriverDomainXMLNamespace;
|
|||||||
extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig;
|
extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig;
|
||||||
|
|
||||||
int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
|
int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm);
|
virDomainObjPtr vm, int asyncJob);
|
||||||
|
|
||||||
bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
|
bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
|
||||||
virDomainDefPtr src,
|
virDomainDefPtr src,
|
||||||
|
@ -1661,7 +1661,8 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr conn,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemuProcessStart(conn, driver, vm, NULL, -1, NULL, NULL,
|
if (qemuProcessStart(conn, driver, vm, QEMU_ASYNC_JOB_NONE,
|
||||||
|
NULL, -1, NULL, NULL,
|
||||||
VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
|
VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
|
||||||
start_flags) < 0) {
|
start_flags) < 0) {
|
||||||
virDomainAuditStart(vm, "booted", false);
|
virDomainAuditStart(vm, "booted", false);
|
||||||
@ -5499,7 +5500,8 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Set the migration source and start it up. */
|
/* Set the migration source and start it up. */
|
||||||
ret = qemuProcessStart(conn, driver, vm, "stdio", *fd, path, NULL,
|
ret = qemuProcessStart(conn, driver, vm, QEMU_ASYNC_JOB_NONE,
|
||||||
|
"stdio", *fd, path, NULL,
|
||||||
VIR_NETDEV_VPORT_PROFILE_OP_RESTORE,
|
VIR_NETDEV_VPORT_PROFILE_OP_RESTORE,
|
||||||
VIR_QEMU_PROCESS_START_PAUSED);
|
VIR_QEMU_PROCESS_START_PAUSED);
|
||||||
|
|
||||||
@ -6196,7 +6198,8 @@ qemuDomainObjStart(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = qemuProcessStart(conn, driver, vm, NULL, -1, NULL, NULL,
|
ret = qemuProcessStart(conn, driver, vm, QEMU_ASYNC_JOB_NONE,
|
||||||
|
NULL, -1, NULL, NULL,
|
||||||
VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags);
|
VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags);
|
||||||
virDomainAuditStart(vm, "booted", ret >= 0);
|
virDomainAuditStart(vm, "booted", ret >= 0);
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
@ -6553,7 +6556,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
qemuDomainUpdateDeviceList(driver, vm);
|
qemuDomainUpdateDeviceList(driver, vm, QEMU_ASYNC_JOB_NONE);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -6613,7 +6616,7 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
qemuDomainUpdateDeviceList(driver, vm);
|
qemuDomainUpdateDeviceList(driver, vm, QEMU_ASYNC_JOB_NONE);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -14165,8 +14168,8 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
|
|||||||
if (config)
|
if (config)
|
||||||
virDomainObjAssignDef(vm, config, false, NULL);
|
virDomainObjAssignDef(vm, config, false, NULL);
|
||||||
|
|
||||||
rc = qemuProcessStart(snapshot->domain->conn,
|
rc = qemuProcessStart(snapshot->domain->conn, driver, vm,
|
||||||
driver, vm, NULL, -1, NULL, snap,
|
QEMU_ASYNC_JOB_NONE, NULL, -1, NULL, snap,
|
||||||
VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
|
VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
|
||||||
VIR_QEMU_PROCESS_START_PAUSED);
|
VIR_QEMU_PROCESS_START_PAUSED);
|
||||||
virDomainAuditStart(vm, "from-snapshot", rc >= 0);
|
virDomainAuditStart(vm, "from-snapshot", rc >= 0);
|
||||||
@ -14263,8 +14266,8 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
|
|||||||
|
|
||||||
if (event)
|
if (event)
|
||||||
qemuDomainEventQueue(driver, event);
|
qemuDomainEventQueue(driver, event);
|
||||||
rc = qemuProcessStart(snapshot->domain->conn,
|
rc = qemuProcessStart(snapshot->domain->conn, driver, vm,
|
||||||
driver, vm, NULL, -1, NULL, NULL,
|
QEMU_ASYNC_JOB_NONE, NULL, -1, NULL, NULL,
|
||||||
VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
|
VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
|
||||||
start_flags);
|
start_flags);
|
||||||
virDomainAuditStart(vm, "from-snapshot", rc >= 0);
|
virDomainAuditStart(vm, "from-snapshot", rc >= 0);
|
||||||
|
@ -2357,7 +2357,8 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver,
|
|||||||
ret = qemuDomainChangeGraphicsPasswords(driver, vm,
|
ret = qemuDomainChangeGraphicsPasswords(driver, vm,
|
||||||
VIR_DOMAIN_GRAPHICS_TYPE_VNC,
|
VIR_DOMAIN_GRAPHICS_TYPE_VNC,
|
||||||
&dev->data.vnc.auth,
|
&dev->data.vnc.auth,
|
||||||
cfg->vncPassword);
|
cfg->vncPassword,
|
||||||
|
QEMU_ASYNC_JOB_NONE);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -2407,7 +2408,8 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver,
|
|||||||
ret = qemuDomainChangeGraphicsPasswords(driver, vm,
|
ret = qemuDomainChangeGraphicsPasswords(driver, vm,
|
||||||
VIR_DOMAIN_GRAPHICS_TYPE_SPICE,
|
VIR_DOMAIN_GRAPHICS_TYPE_SPICE,
|
||||||
&dev->data.spice.auth,
|
&dev->data.spice.auth,
|
||||||
cfg->spicePassword);
|
cfg->spicePassword,
|
||||||
|
QEMU_ASYNC_JOB_NONE);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -3517,7 +3519,8 @@ qemuDomainChangeGraphicsPasswords(virQEMUDriverPtr driver,
|
|||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
int type,
|
int type,
|
||||||
virDomainGraphicsAuthDefPtr auth,
|
virDomainGraphicsAuthDefPtr auth,
|
||||||
const char *defaultPasswd)
|
const char *defaultPasswd,
|
||||||
|
int asyncJob)
|
||||||
{
|
{
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
@ -3534,7 +3537,8 @@ qemuDomainChangeGraphicsPasswords(virQEMUDriverPtr driver,
|
|||||||
if (auth->connected)
|
if (auth->connected)
|
||||||
connected = virDomainGraphicsAuthConnectedTypeToString(auth->connected);
|
connected = virDomainGraphicsAuthConnectedTypeToString(auth->connected);
|
||||||
|
|
||||||
qemuDomainObjEnterMonitor(driver, vm);
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
|
goto cleanup;
|
||||||
ret = qemuMonitorSetPassword(priv->mon,
|
ret = qemuMonitorSetPassword(priv->mon,
|
||||||
type,
|
type,
|
||||||
auth->passwd ? auth->passwd : defaultPasswd,
|
auth->passwd ? auth->passwd : defaultPasswd,
|
||||||
|
@ -61,7 +61,8 @@ int qemuDomainChangeGraphicsPasswords(virQEMUDriverPtr driver,
|
|||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
int type,
|
int type,
|
||||||
virDomainGraphicsAuthDefPtr auth,
|
virDomainGraphicsAuthDefPtr auth,
|
||||||
const char *defaultPasswd);
|
const char *defaultPasswd,
|
||||||
|
int asyncJob);
|
||||||
int qemuDomainChangeNet(virQEMUDriverPtr driver,
|
int qemuDomainChangeNet(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
virDomainPtr dom,
|
virDomainPtr dom,
|
||||||
|
@ -2480,7 +2480,8 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
|
|||||||
/* Start the QEMU daemon, with the same command-line arguments plus
|
/* Start the QEMU daemon, with the same command-line arguments plus
|
||||||
* -incoming $migrateFrom
|
* -incoming $migrateFrom
|
||||||
*/
|
*/
|
||||||
if (qemuProcessStart(dconn, driver, vm, migrateFrom, dataFD[0], NULL, NULL,
|
if (qemuProcessStart(dconn, driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
|
||||||
|
migrateFrom, dataFD[0], NULL, NULL,
|
||||||
VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_START,
|
VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_START,
|
||||||
VIR_QEMU_PROCESS_START_PAUSED |
|
VIR_QEMU_PROCESS_START_PAUSED |
|
||||||
VIR_QEMU_PROCESS_START_AUTODESTROY) < 0) {
|
VIR_QEMU_PROCESS_START_AUTODESTROY) < 0) {
|
||||||
|
@ -1506,7 +1506,8 @@ static qemuMonitorCallbacks monitorCallbacks = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm, int logfd)
|
qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm, int asyncJob,
|
||||||
|
int logfd)
|
||||||
{
|
{
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
@ -1557,7 +1558,8 @@ qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm, int logfd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
qemuDomainObjEnterMonitor(driver, vm);
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
|
goto error;
|
||||||
ret = qemuMonitorSetCapabilities(priv->mon);
|
ret = qemuMonitorSetCapabilities(priv->mon);
|
||||||
if (ret == 0 &&
|
if (ret == 0 &&
|
||||||
virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MONITOR_JSON))
|
virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MONITOR_JSON))
|
||||||
@ -1963,6 +1965,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
|
|||||||
static int
|
static int
|
||||||
qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
|
qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
|
int asyncJob,
|
||||||
virQEMUCapsPtr qemuCaps,
|
virQEMUCapsPtr qemuCaps,
|
||||||
off_t pos)
|
off_t pos)
|
||||||
{
|
{
|
||||||
@ -1988,7 +1991,7 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
|
|||||||
}
|
}
|
||||||
|
|
||||||
VIR_DEBUG("Connect monitor to %p '%s'", vm, vm->def->name);
|
VIR_DEBUG("Connect monitor to %p '%s'", vm, vm->def->name);
|
||||||
if (qemuConnectMonitor(driver, vm, logfd) < 0)
|
if (qemuConnectMonitor(driver, vm, asyncJob, logfd) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Try to get the pty path mappings again via the monitor. This is much more
|
/* Try to get the pty path mappings again via the monitor. This is much more
|
||||||
@ -2000,7 +2003,8 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
qemuDomainObjEnterMonitor(driver, vm);
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
|
goto cleanup;
|
||||||
ret = qemuMonitorGetPtyPaths(priv->mon, paths);
|
ret = qemuMonitorGetPtyPaths(priv->mon, paths);
|
||||||
qemuDomainObjExitMonitor(driver, vm);
|
qemuDomainObjExitMonitor(driver, vm);
|
||||||
|
|
||||||
@ -2046,13 +2050,14 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
qemuProcessDetectVcpuPIDs(virQEMUDriverPtr driver,
|
qemuProcessDetectVcpuPIDs(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm)
|
virDomainObjPtr vm, int asyncJob)
|
||||||
{
|
{
|
||||||
pid_t *cpupids = NULL;
|
pid_t *cpupids = NULL;
|
||||||
int ncpupids;
|
int ncpupids;
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
|
|
||||||
qemuDomainObjEnterMonitor(driver, vm);
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
|
return -1;
|
||||||
/* failure to get the VCPU<-> PID mapping or to execute the query
|
/* failure to get the VCPU<-> PID mapping or to execute the query
|
||||||
* command will not be treated fatal as some versions of qemu don't
|
* command will not be treated fatal as some versions of qemu don't
|
||||||
* support this command */
|
* support this command */
|
||||||
@ -2274,7 +2279,8 @@ qemuProcessSetEmulatorAffinities(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|||||||
static int
|
static int
|
||||||
qemuProcessInitPasswords(virConnectPtr conn,
|
qemuProcessInitPasswords(virConnectPtr conn,
|
||||||
virQEMUDriverPtr driver,
|
virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm)
|
virDomainObjPtr vm,
|
||||||
|
int asyncJob)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
@ -2287,12 +2293,14 @@ qemuProcessInitPasswords(virConnectPtr conn,
|
|||||||
ret = qemuDomainChangeGraphicsPasswords(driver, vm,
|
ret = qemuDomainChangeGraphicsPasswords(driver, vm,
|
||||||
VIR_DOMAIN_GRAPHICS_TYPE_VNC,
|
VIR_DOMAIN_GRAPHICS_TYPE_VNC,
|
||||||
&graphics->data.vnc.auth,
|
&graphics->data.vnc.auth,
|
||||||
cfg->vncPassword);
|
cfg->vncPassword,
|
||||||
|
asyncJob);
|
||||||
} else if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
|
} else if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
|
||||||
ret = qemuDomainChangeGraphicsPasswords(driver, vm,
|
ret = qemuDomainChangeGraphicsPasswords(driver, vm,
|
||||||
VIR_DOMAIN_GRAPHICS_TYPE_SPICE,
|
VIR_DOMAIN_GRAPHICS_TYPE_SPICE,
|
||||||
&graphics->data.spice.auth,
|
&graphics->data.spice.auth,
|
||||||
cfg->spicePassword);
|
cfg->spicePassword,
|
||||||
|
asyncJob);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -2315,7 +2323,8 @@ qemuProcessInitPasswords(virConnectPtr conn,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
alias = vm->def->disks[i]->info.alias;
|
alias = vm->def->disks[i]->info.alias;
|
||||||
qemuDomainObjEnterMonitor(driver, vm);
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
|
goto cleanup;
|
||||||
ret = qemuMonitorSetDrivePassphrase(priv->mon, alias, secret);
|
ret = qemuMonitorSetDrivePassphrase(priv->mon, alias, secret);
|
||||||
VIR_FREE(secret);
|
VIR_FREE(secret);
|
||||||
qemuDomainObjExitMonitor(driver, vm);
|
qemuDomainObjExitMonitor(driver, vm);
|
||||||
@ -2699,14 +2708,16 @@ qemuProcessDetectPCIAddresses(virDomainObjPtr vm,
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
qemuProcessInitPCIAddresses(virQEMUDriverPtr driver,
|
qemuProcessInitPCIAddresses(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm)
|
virDomainObjPtr vm,
|
||||||
|
int asyncJob)
|
||||||
{
|
{
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
int naddrs;
|
int naddrs;
|
||||||
int ret;
|
int ret;
|
||||||
qemuMonitorPCIAddress *addrs = NULL;
|
qemuMonitorPCIAddress *addrs = NULL;
|
||||||
|
|
||||||
qemuDomainObjEnterMonitor(driver, vm);
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
|
return -1;
|
||||||
naddrs = qemuMonitorGetAllPCIAddresses(priv->mon,
|
naddrs = qemuMonitorGetAllPCIAddresses(priv->mon,
|
||||||
&addrs);
|
&addrs);
|
||||||
qemuDomainObjExitMonitor(driver, vm);
|
qemuDomainObjExitMonitor(driver, vm);
|
||||||
@ -3211,7 +3222,7 @@ qemuProcessUpdateDevices(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
old = priv->qemuDevices;
|
old = priv->qemuDevices;
|
||||||
priv->qemuDevices = NULL;
|
priv->qemuDevices = NULL;
|
||||||
if (qemuDomainUpdateDeviceList(driver, vm) < 0)
|
if (qemuDomainUpdateDeviceList(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((tmp = old)) {
|
if ((tmp = old)) {
|
||||||
@ -3277,7 +3288,7 @@ qemuProcessReconnect(void *opaque)
|
|||||||
virObjectRef(obj);
|
virObjectRef(obj);
|
||||||
|
|
||||||
/* XXX check PID liveliness & EXE path */
|
/* XXX check PID liveliness & EXE path */
|
||||||
if (qemuConnectMonitor(driver, obj, -1) < 0)
|
if (qemuConnectMonitor(driver, obj, QEMU_ASYNC_JOB_NONE, -1) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* Failure to connect to agent shouldn't be fatal */
|
/* Failure to connect to agent shouldn't be fatal */
|
||||||
@ -3654,7 +3665,9 @@ qemuValidateCpuMax(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
|
|||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
qemuProcessVerifyGuestCPU(virQEMUDriverPtr driver, virDomainObjPtr vm)
|
qemuProcessVerifyGuestCPU(virQEMUDriverPtr driver,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
int asyncJob)
|
||||||
{
|
{
|
||||||
virDomainDefPtr def = vm->def;
|
virDomainDefPtr def = vm->def;
|
||||||
virArch arch = def->os.arch;
|
virArch arch = def->os.arch;
|
||||||
@ -3667,7 +3680,8 @@ qemuProcessVerifyGuestCPU(virQEMUDriverPtr driver, virDomainObjPtr vm)
|
|||||||
switch (arch) {
|
switch (arch) {
|
||||||
case VIR_ARCH_I686:
|
case VIR_ARCH_I686:
|
||||||
case VIR_ARCH_X86_64:
|
case VIR_ARCH_X86_64:
|
||||||
qemuDomainObjEnterMonitor(driver, vm);
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
|
return false;
|
||||||
rc = qemuMonitorGetGuestCPU(priv->mon, arch, &guestcpu);
|
rc = qemuMonitorGetGuestCPU(priv->mon, arch, &guestcpu);
|
||||||
qemuDomainObjExitMonitor(driver, vm);
|
qemuDomainObjExitMonitor(driver, vm);
|
||||||
|
|
||||||
@ -3716,6 +3730,7 @@ qemuProcessVerifyGuestCPU(virQEMUDriverPtr driver, virDomainObjPtr vm)
|
|||||||
int qemuProcessStart(virConnectPtr conn,
|
int qemuProcessStart(virConnectPtr conn,
|
||||||
virQEMUDriverPtr driver,
|
virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
|
int asyncJob,
|
||||||
const char *migrateFrom,
|
const char *migrateFrom,
|
||||||
int stdin_fd,
|
int stdin_fd,
|
||||||
const char *stdin_path,
|
const char *stdin_path,
|
||||||
@ -4207,7 +4222,7 @@ int qemuProcessStart(virConnectPtr conn,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
VIR_DEBUG("Waiting for monitor to show up");
|
VIR_DEBUG("Waiting for monitor to show up");
|
||||||
if (qemuProcessWaitForMonitor(driver, vm, priv->qemuCaps, pos) < 0)
|
if (qemuProcessWaitForMonitor(driver, vm, asyncJob, priv->qemuCaps, pos) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Failure to connect to agent shouldn't be fatal */
|
/* Failure to connect to agent shouldn't be fatal */
|
||||||
@ -4222,7 +4237,7 @@ int qemuProcessStart(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
VIR_DEBUG("Detecting if required emulator features are present");
|
VIR_DEBUG("Detecting if required emulator features are present");
|
||||||
if (!qemuProcessVerifyGuestCPU(driver, vm))
|
if (!qemuProcessVerifyGuestCPU(driver, vm, asyncJob))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
VIR_DEBUG("Setting up post-init cgroup restrictions");
|
VIR_DEBUG("Setting up post-init cgroup restrictions");
|
||||||
@ -4230,7 +4245,7 @@ int qemuProcessStart(virConnectPtr conn,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
VIR_DEBUG("Detecting VCPU PIDs");
|
VIR_DEBUG("Detecting VCPU PIDs");
|
||||||
if (qemuProcessDetectVcpuPIDs(driver, vm) < 0)
|
if (qemuProcessDetectVcpuPIDs(driver, vm, asyncJob) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
VIR_DEBUG("Setting cgroup for each VCPU (if required)");
|
VIR_DEBUG("Setting cgroup for each VCPU (if required)");
|
||||||
@ -4250,14 +4265,14 @@ int qemuProcessStart(virConnectPtr conn,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
VIR_DEBUG("Setting any required VM passwords");
|
VIR_DEBUG("Setting any required VM passwords");
|
||||||
if (qemuProcessInitPasswords(conn, driver, vm) < 0)
|
if (qemuProcessInitPasswords(conn, driver, vm, asyncJob) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* If we have -device, then addresses are assigned explicitly.
|
/* If we have -device, then addresses are assigned explicitly.
|
||||||
* If not, then we have to detect dynamic ones here */
|
* If not, then we have to detect dynamic ones here */
|
||||||
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
|
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
|
||||||
VIR_DEBUG("Determining domain device PCI addresses");
|
VIR_DEBUG("Determining domain device PCI addresses");
|
||||||
if (qemuProcessInitPCIAddresses(driver, vm) < 0)
|
if (qemuProcessInitPCIAddresses(driver, vm, asyncJob) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4265,7 +4280,8 @@ int qemuProcessStart(virConnectPtr conn,
|
|||||||
/* qemu doesn't support setting this on the command line, so
|
/* qemu doesn't support setting this on the command line, so
|
||||||
* enter the monitor */
|
* enter the monitor */
|
||||||
VIR_DEBUG("Setting network link states");
|
VIR_DEBUG("Setting network link states");
|
||||||
qemuDomainObjEnterMonitor(driver, vm);
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
|
goto cleanup;
|
||||||
if (qemuProcessSetLinkStates(vm) < 0) {
|
if (qemuProcessSetLinkStates(vm) < 0) {
|
||||||
qemuDomainObjExitMonitor(driver, vm);
|
qemuDomainObjExitMonitor(driver, vm);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -4274,7 +4290,7 @@ int qemuProcessStart(virConnectPtr conn,
|
|||||||
qemuDomainObjExitMonitor(driver, vm);
|
qemuDomainObjExitMonitor(driver, vm);
|
||||||
|
|
||||||
VIR_DEBUG("Fetching list of active devices");
|
VIR_DEBUG("Fetching list of active devices");
|
||||||
if (qemuDomainUpdateDeviceList(driver, vm) < 0)
|
if (qemuDomainUpdateDeviceList(driver, vm, asyncJob) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Technically, qemuProcessStart can be called from inside
|
/* Technically, qemuProcessStart can be called from inside
|
||||||
@ -4289,7 +4305,8 @@ int qemuProcessStart(virConnectPtr conn,
|
|||||||
vm->def->mem.cur_balloon);
|
vm->def->mem.cur_balloon);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
qemuDomainObjEnterMonitor(driver, vm);
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
|
goto cleanup;
|
||||||
if (vm->def->memballoon && vm->def->memballoon->period)
|
if (vm->def->memballoon && vm->def->memballoon->period)
|
||||||
qemuMonitorSetMemoryStatsPeriod(priv->mon, vm->def->memballoon->period);
|
qemuMonitorSetMemoryStatsPeriod(priv->mon, vm->def->memballoon->period);
|
||||||
if (qemuMonitorSetBalloon(priv->mon, cur_balloon) < 0) {
|
if (qemuMonitorSetBalloon(priv->mon, cur_balloon) < 0) {
|
||||||
@ -4834,7 +4851,7 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|||||||
vm->pid = pid;
|
vm->pid = pid;
|
||||||
|
|
||||||
VIR_DEBUG("Waiting for monitor to show up");
|
VIR_DEBUG("Waiting for monitor to show up");
|
||||||
if (qemuProcessWaitForMonitor(driver, vm, priv->qemuCaps, -1) < 0)
|
if (qemuProcessWaitForMonitor(driver, vm, QEMU_ASYNC_JOB_NONE, priv->qemuCaps, -1) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* Failure to connect to agent shouldn't be fatal */
|
/* Failure to connect to agent shouldn't be fatal */
|
||||||
@ -4849,14 +4866,14 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|||||||
}
|
}
|
||||||
|
|
||||||
VIR_DEBUG("Detecting VCPU PIDs");
|
VIR_DEBUG("Detecting VCPU PIDs");
|
||||||
if (qemuProcessDetectVcpuPIDs(driver, vm) < 0)
|
if (qemuProcessDetectVcpuPIDs(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* If we have -device, then addresses are assigned explicitly.
|
/* If we have -device, then addresses are assigned explicitly.
|
||||||
* If not, then we have to detect dynamic ones here */
|
* If not, then we have to detect dynamic ones here */
|
||||||
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
|
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
|
||||||
VIR_DEBUG("Determining domain device PCI addresses");
|
VIR_DEBUG("Determining domain device PCI addresses");
|
||||||
if (qemuProcessInitPCIAddresses(driver, vm) < 0)
|
if (qemuProcessInitPCIAddresses(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,6 +53,7 @@ typedef enum {
|
|||||||
int qemuProcessStart(virConnectPtr conn,
|
int qemuProcessStart(virConnectPtr conn,
|
||||||
virQEMUDriverPtr driver,
|
virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
|
int asyncJob,
|
||||||
const char *migrateFrom,
|
const char *migrateFrom,
|
||||||
int stdin_fd,
|
int stdin_fd,
|
||||||
const char *stdin_path,
|
const char *stdin_path,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user