diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index bc2fdfbaa0..bf23d460d7 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1296,7 +1296,6 @@ qemuDomainObjPrivateFree(void *data) virDomainVirtioSerialAddrSetFree(priv->vioserialaddrs); virDomainChrSourceDefFree(priv->monConfig); qemuDomainObjFreeJob(priv); - VIR_FREE(priv->vcpupids); VIR_FREE(priv->lockState); VIR_FREE(priv->origname); @@ -1325,19 +1324,25 @@ qemuDomainObjPrivateFree(void *data) static void qemuDomainObjPrivateXMLFormatVcpus(virBufferPtr buf, - int *vcpupids, - int nvcpupids) + virDomainDefPtr def) { size_t i; - - if (!nvcpupids) - return; + size_t maxvcpus = virDomainDefGetVcpusMax(def); + virDomainVcpuDefPtr vcpu; + pid_t tid; virBufferAddLit(buf, "\n"); virBufferAdjustIndent(buf, 2); - for (i = 0; i < nvcpupids; i++) - virBufferAsprintf(buf, "\n", i, vcpupids[i]); + for (i = 0; i < maxvcpus; i++) { + vcpu = virDomainDefGetVcpu(def, i); + tid = QEMU_DOMAIN_VCPU_PRIVATE(vcpu)->tid; + + if (!vcpu->online || tid == 0) + continue; + + virBufferAsprintf(buf, "\n", i, tid); + } virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); @@ -1371,7 +1376,7 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, virDomainChrTypeToString(priv->monConfig->type)); } - qemuDomainObjPrivateXMLFormatVcpus(buf, priv->vcpupids, priv->nvcpupids); + qemuDomainObjPrivateXMLFormatVcpus(buf, vm->def); if (priv->qemuCaps) { size_t i; @@ -1464,27 +1469,31 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, static int qemuDomainObjPrivateXMLParseVcpu(xmlNodePtr node, unsigned int idx, - qemuDomainObjPrivatePtr priv) + virDomainDefPtr def) { + virDomainVcpuDefPtr vcpu; char *idstr; char *pidstr; + unsigned int tmp; int ret = -1; - if ((idstr = virXMLPropString(node, "id"))) { - if (virStrToLong_uip(idstr, NULL, 10, &idx) < 0 || - idx >= priv->nvcpupids) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("invalid vcpu index '%s'"), idstr); - goto cleanup; - } + idstr = virXMLPropString(node, "id"); + + if ((idstr && virStrToLong_uip(idstr, NULL, 10, &idx)) < 0 || + !(vcpu = virDomainDefGetVcpu(def, idx))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("invalid vcpu index '%s'"), idstr); + goto cleanup; } if (!(pidstr = virXMLPropString(node, "pid"))) goto cleanup; - if (virStrToLong_i(pidstr, NULL, 10, &(priv->vcpupids[idx])) < 0) + if (virStrToLong_uip(pidstr, NULL, 10, &tmp) < 0) goto cleanup; + QEMU_DOMAIN_VCPU_PRIVATE(vcpu)->tid = tmp; + ret = 0; cleanup: @@ -1547,12 +1556,8 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, if ((n = virXPathNodeSet("./vcpus/vcpu", ctxt, &nodes)) < 0) goto error; - priv->nvcpupids = n; - if (VIR_REALLOC_N(priv->vcpupids, priv->nvcpupids) < 0) - goto error; - for (i = 0; i < n; i++) { - if (qemuDomainObjPrivateXMLParseVcpu(nodes[i], i, priv) < 0) + if (qemuDomainObjPrivateXMLParseVcpu(nodes[i], i, vm->def) < 0) goto error; } VIR_FREE(nodes); @@ -5506,9 +5511,18 @@ qemuDomainAdjustMaxMemLock(virDomainObjPtr vm) bool qemuDomainHasVcpuPids(virDomainObjPtr vm) { - qemuDomainObjPrivatePtr priv = vm->privateData; + size_t i; + size_t maxvcpus = virDomainDefGetVcpusMax(vm->def); + virDomainVcpuDefPtr vcpu; - return priv->nvcpupids > 0; + for (i = 0; i < maxvcpus; i++) { + vcpu = virDomainDefGetVcpu(vm->def, i); + + if (QEMU_DOMAIN_VCPU_PRIVATE(vcpu)->tid > 0) + return true; + } + + return false; } @@ -5521,14 +5535,10 @@ qemuDomainHasVcpuPids(virDomainObjPtr vm) */ pid_t qemuDomainGetVcpuPid(virDomainObjPtr vm, - unsigned int vcpu) + unsigned int vcpuid) { - qemuDomainObjPrivatePtr priv = vm->privateData; - - if (vcpu >= priv->nvcpupids) - return 0; - - return priv->vcpupids[vcpu]; + virDomainVcpuDefPtr vcpu = virDomainDefGetVcpu(vm->def, vcpuid); + return QEMU_DOMAIN_VCPU_PRIVATE(vcpu)->tid; } @@ -5548,9 +5558,12 @@ qemuDomainDetectVcpuPids(virQEMUDriverPtr driver, virDomainObjPtr vm, int asyncJob) { + virDomainVcpuDefPtr vcpu; + size_t maxvcpus = virDomainDefGetVcpusMax(vm->def); pid_t *cpupids = NULL; - int ncpupids = 0; - qemuDomainObjPrivatePtr priv = vm->privateData; + int ncpupids; + size_t i; + int ret = -1; /* * Current QEMU *can* report info about host threads mapped @@ -5581,22 +5594,32 @@ qemuDomainDetectVcpuPids(virQEMUDriverPtr driver, * to try to do this hard work. */ if (vm->def->virtType == VIR_DOMAIN_VIRT_QEMU) - goto done; + return 0; if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) return -1; - ncpupids = qemuMonitorGetCPUInfo(priv->mon, &cpupids); + ncpupids = qemuMonitorGetCPUInfo(qemuDomainGetMonitor(vm), &cpupids); if (qemuDomainObjExitMonitor(driver, vm) < 0) { - VIR_FREE(cpupids); - return -2; + ret = -2; + goto cleanup; } + /* 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 * support this command */ if (ncpupids <= 0) { virResetLastError(); - ncpupids = 0; - goto done; + ret = 0; + goto cleanup; + } + + for (i = 0; i < maxvcpus; i++) { + vcpu = virDomainDefGetVcpu(vm->def, i); + + if (i < ncpupids) + QEMU_DOMAIN_VCPU_PRIVATE(vcpu)->tid = cpupids[i]; + else + QEMU_DOMAIN_VCPU_PRIVATE(vcpu)->tid = 0; } if (ncpupids != virDomainDefGetVcpus(vm->def)) { @@ -5604,15 +5627,14 @@ qemuDomainDetectVcpuPids(virQEMUDriverPtr driver, _("got wrong number of vCPU pids from QEMU monitor. " "got %d, wanted %d"), ncpupids, virDomainDefGetVcpus(vm->def)); - VIR_FREE(cpupids); - return -1; + goto cleanup; } - done: - VIR_FREE(priv->vcpupids); - priv->nvcpupids = ncpupids; - priv->vcpupids = cpupids; - return ncpupids; + ret = ncpupids; + + cleanup: + VIR_FREE(cpupids); + return ret; } diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 16d0996011..114db98db6 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -184,9 +184,6 @@ struct _qemuDomainObjPrivate { bool beingDestroyed; char *pidfile; - int nvcpupids; - int *vcpupids; - virDomainPCIAddressSetPtr pciaddrs; virDomainCCWAddressSetPtr ccwaddrs; virDomainVirtioSerialAddrSetPtr vioserialaddrs; @@ -318,7 +315,7 @@ typedef qemuDomainVcpuPrivate *qemuDomainVcpuPrivatePtr; struct _qemuDomainVcpuPrivate { virObject parent; - int dummy; + pid_t tid; /* vcpu thread id */ }; # define QEMU_DOMAIN_VCPU_PRIVATE(vcpu) \ @@ -649,7 +646,7 @@ int qemuDomainDefValidateMemoryHotplug(const virDomainDef *def, const virDomainMemoryDef *mem); bool qemuDomainHasVcpuPids(virDomainObjPtr vm); -pid_t qemuDomainGetVcpuPid(virDomainObjPtr vm, unsigned int vcpu); +pid_t qemuDomainGetVcpuPid(virDomainObjPtr vm, unsigned int vcpuid); int qemuDomainDetectVcpuPids(virQEMUDriverPtr driver, virDomainObjPtr vm, int asyncJob); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 96eaeb2fc0..c6129be0fa 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5899,8 +5899,6 @@ void qemuProcessStop(virQEMUDriverPtr driver, vm->taint = 0; vm->pid = -1; virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, reason); - VIR_FREE(priv->vcpupids); - priv->nvcpupids = 0; for (i = 0; i < vm->def->niothreadids; i++) vm->def->iothreadids[i]->thread_id = 0; virObjectUnref(priv->qemuCaps);