diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 74560a4f01..84e5fa530c 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -618,21 +618,33 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, virBufferAddLit(buf, "\n"); } + if (priv->autoNodeset) { + char *nodeset = virBitmapFormat(priv->autoNodeset); + + if (!nodeset) + return -1; + + virBufferAsprintf(buf, "\n", nodeset); + VIR_FREE(nodeset); + } + return 0; } static int qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, virDomainObjPtr vm, - virDomainDefParserConfigPtr config ATTRIBUTE_UNUSED) + virDomainDefParserConfigPtr config) { qemuDomainObjPrivatePtr priv = vm->privateData; + virQEMUDriverPtr driver = config->priv; char *monitorpath; char *tmp = NULL; int n; size_t i; xmlNodePtr *nodes = NULL; virQEMUCapsPtr qemuCaps = NULL; + virCapsPtr caps = NULL; if (VIR_ALLOC(priv->monConfig) < 0) goto error; @@ -805,15 +817,33 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, } VIR_FREE(nodes); + if (!(caps = virQEMUDriverGetCapabilities(driver, false))) + goto error; + + if ((tmp = virXPathString("string(./numad/@nodeset)", ctxt))) { + if (virBitmapParse(tmp, 0, &priv->autoNodeset, + caps->host.nnumaCell_max) < 0) + goto error; + + if (!(priv->autoCpuset = virCapabilitiesGetCpusForNodemask(caps, + priv->autoNodeset))) + goto error; + } + virObjectUnref(caps); + caps = NULL; + VIR_FREE(tmp); + return 0; error: virDomainChrSourceDefFree(priv->monConfig); priv->monConfig = NULL; VIR_FREE(nodes); + VIR_FREE(tmp); virStringFreeList(priv->qemuDevices); priv->qemuDevices = NULL; virObjectUnref(qemuCaps); + virObjectUnref(caps); return -1; } diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 08923faa84..5c1c2e9b86 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -130,7 +130,8 @@ static const char testStatusXMLPrefix[] = " \n" " \n" " \n" -" \n"; +" \n" +" \n"; static const char testStatusXMLSuffix[] = "\n"; diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index ceaabb6a24..a2f429909a 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -336,6 +336,8 @@ virCapsPtr testQemuCapsInit(void) caps->host.cpu = cpuDefault; + caps->host.nnumaCell_max = 4; + if ((machines = testQemuAllocMachines(&nmachines)) == NULL) goto cleanup;