qemu: Store vCPU thread ids in vcpu private data objects

Rather than storing them in an external array store them directly.
This commit is contained in:
Peter Krempa 2016-07-01 14:56:14 +02:00
parent 3f57ce4a76
commit 5184f398b4
3 changed files with 71 additions and 54 deletions

View File

@ -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, "<vcpus>\n");
virBufferAdjustIndent(buf, 2);
for (i = 0; i < nvcpupids; i++)
virBufferAsprintf(buf, "<vcpu id='%zu' pid='%d'/>\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, "<vcpu id='%zu' pid='%d'/>\n", i, tid);
}
virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</vcpus>\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;
}

View File

@ -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);

View File

@ -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);