diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 30742fc81d..77306f3e94 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -830,9 +830,10 @@ static qemuMonitorCallbacks monitorCallbacks = { }; static int -qemuConnectMonitor(virDomainObjPtr vm) +qemuConnectMonitor(struct qemud_driver *driver, virDomainObjPtr vm) { qemuDomainObjPrivatePtr priv = vm->privateData; + int ret; /* Hold an extra reference because we can't allow 'vm' to be * deleted while the monitor is active */ @@ -846,7 +847,16 @@ qemuConnectMonitor(virDomainObjPtr vm) return -1; } - return 0; + qemuDomainObjEnterMonitorWithDriver(driver, vm); + ret = qemuMonitorSetCapabilities(priv->mon); + qemuDomainObjExitMonitorWithDriver(driver, vm); + + if (ret < 0) { + qemuMonitorClose(priv->mon); + priv->mon = NULL; + } + + return ret; } /* @@ -868,7 +878,7 @@ qemuReconnectDomain(void *payload, const char *name ATTRIBUTE_UNUSED, void *opaq priv = obj->privateData; /* XXX check PID liveliness & EXE path */ - if (qemuConnectMonitor(obj) < 0) + if (qemuConnectMonitor(driver, obj) < 0) goto error; if (qemuUpdateActivePciHostdevs(driver, obj->def) < 0) { @@ -1577,7 +1587,7 @@ qemudWaitForMonitor(struct qemud_driver* driver, return -1; VIR_DEBUG("Connect monitor to %p '%s'", vm, vm->def->name); - if (qemuConnectMonitor(vm) < 0) + if (qemuConnectMonitor(driver, vm) < 0) return -1; /* Try to get the pty path mappings again via the monitor. This is much more diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index c1d369b218..b88532c7cf 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -791,6 +791,19 @@ int qemuMonitorEmitStop(qemuMonitorPtr mon) } +int qemuMonitorSetCapabilities(qemuMonitorPtr mon) +{ + int ret; + DEBUG("mon=%p, fd=%d", mon, mon->fd); + + if (mon->json) + ret = qemuMonitorJSONSetCapabilities(mon); + else + ret = 0; + return ret; +} + + int qemuMonitorStartCPUs(qemuMonitorPtr mon, virConnectPtr conn) diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 786ad7abe1..0ac39574fc 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -99,6 +99,8 @@ qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm, int qemuMonitorClose(qemuMonitorPtr mon); +int qemuMonitorSetCapabilities(qemuMonitorPtr mon); + void qemuMonitorLock(qemuMonitorPtr mon); void qemuMonitorUnlock(qemuMonitorPtr mon); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index c9b8d6049f..f0dcf81c40 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -476,6 +476,26 @@ static void qemuMonitorJSONHandleStop(qemuMonitorPtr mon, virJSONValuePtr data A } +int +qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon) +{ + int ret; + virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("qmp_capabilities", NULL); + virJSONValuePtr reply = NULL; + if (!cmd) + return -1; + + ret = qemuMonitorJSONCommand(mon, cmd, &reply); + + if (ret == 0) + ret = qemuMonitorJSONCheckError(cmd, reply); + + virJSONValueFree(cmd); + virJSONValueFree(reply); + return ret; +} + + int qemuMonitorJSONStartCPUs(qemuMonitorPtr mon, virConnectPtr conn ATTRIBUTE_UNUSED) diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 65a70e3194..c6a6d5141a 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -34,6 +34,8 @@ int qemuMonitorJSONIOProcess(qemuMonitorPtr mon, size_t len, qemuMonitorMessagePtr msg); +int qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon); + int qemuMonitorJSONStartCPUs(qemuMonitorPtr mon, virConnectPtr conn); int qemuMonitorJSONStopCPUs(qemuMonitorPtr mon);