* src/qemu_driver.c: Don't trust monitor for vcpu PID info on restart * src/domain_conf.c: Save and load vCPU PID info from domain status file --- src/domain_conf.c | 35 +++++++++++++++++++++++++++++++++++ src/qemu_driver.c | 5 +---- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/domain_conf.c b/src/domain_conf.c index 050cf50..5ae0775 100644 --- a/src/domain_conf.c +++ b/src/domain_conf.c @@ -3061,6 +3061,8 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn, xmlNodePtr oldnode; virDomainObjPtr obj; char *monitorpath; + xmlNodePtr *nodes = NULL; + int n, i; if (!(obj = virDomainObjNew(conn))) return NULL; @@ -3133,9 +3135,32 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn, break; } + n = virXPathNodeSet(conn, "./vcpus/vcpu", ctxt, &nodes); + if (n < 0) + goto error; + if (n) { + obj->nvcpupids = n; + if (VIR_REALLOC_N(obj->vcpupids, obj->nvcpupids) < 0) + goto error; + + for (i = 0 ; i < n ; i++) { + char *pidstr = virXMLPropString(nodes[i], "pid"); + if (!pidstr) + goto error; + + if (virStrToLong_i(pidstr, NULL, 10, &(obj->vcpupids[i])) < 0) { + VIR_FREE(pidstr); + goto error; + } + VIR_FREE(pidstr); + } + VIR_FREE(nodes); + } + return obj; error: + VIR_FREE(nodes); virDomainChrDefFree(obj->monitor_chr); virDomainObjFree(obj); return NULL; @@ -4422,6 +4447,16 @@ char *virDomainObjFormat(virConnectPtr conn, virBufferVSprintf(&buf, " type='%s'/>\n", virDomainChrTypeToString(obj->monitor_chr->type)); + + if (obj->nvcpupids) { + int i; + virBufferAddLit(&buf, " <vcpus>\n"); + for (i = 0 ; i < obj->nvcpupids ; i++) { + virBufferVSprintf(&buf, " <vcpu pid='%d'/>\n", obj->vcpupids[i]); + } + virBufferAddLit(&buf, " </vcpus>\n"); + } + if (!(config_xml = virDomainDefFormat(conn, obj->def, flags))) diff --git a/src/qemu_driver.c b/src/qemu_driver.c index 0e7d8d4..a65334f 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -336,10 +336,6 @@ qemuReconnectDomain(struct qemud_driver *driver, goto error; } - if (qemudDetectVcpuPIDs(NULL, obj) < 0) { - goto error; - } - if (qemuUpdateActivePciHostdevs(driver, obj->def) < 0) { goto error; } @@ -2519,6 +2515,7 @@ qemudMonitorCommandWithHandler(const virDomainObjPtr vm, qemuMonitorDiscardPendingData(vm); + VIR_DEBUG("Send '%s'", cmd); if (qemudMonitorSend(vm, cmd, scm_fd) < 0) return -1; -- 1.6.2.5 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list