提交 2dda319a 编写于 作者: P Peter Krempa

qemu: domain: Extract parsing and formatting of priv->autoNodeset

Move the code to separate functions to avoid complicating the existing
ones with changes.
上级 a908e9e4
...@@ -1760,6 +1760,29 @@ qemuDomainObjPrivateXMLFormatVcpus(virBufferPtr buf, ...@@ -1760,6 +1760,29 @@ qemuDomainObjPrivateXMLFormatVcpus(virBufferPtr buf,
} }
static int
qemuDomainObjPtrivateXMLFormatAutomaticPlacement(virBufferPtr buf,
qemuDomainObjPrivatePtr priv)
{
char *nodeset = NULL;
int ret = -1;
if (!priv->autoNodeset)
return 0;
if (!(nodeset = virBitmapFormat(priv->autoNodeset)))
goto cleanup;
virBufferAsprintf(buf, "<numad nodeset='%s'/>\n", nodeset);
ret = 0;
cleanup:
VIR_FREE(nodeset);
return ret;
}
static int static int
qemuDomainObjPrivateXMLFormat(virBufferPtr buf, qemuDomainObjPrivateXMLFormat(virBufferPtr buf,
virDomainObjPtr vm) virDomainObjPtr vm)
...@@ -1869,15 +1892,8 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, ...@@ -1869,15 +1892,8 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf,
virBufferAddLit(buf, "</devices>\n"); virBufferAddLit(buf, "</devices>\n");
} }
if (priv->autoNodeset) { if (qemuDomainObjPtrivateXMLFormatAutomaticPlacement(buf, priv) < 0)
char *nodeset = virBitmapFormat(priv->autoNodeset); return -1;
if (!nodeset)
return -1;
virBufferAsprintf(buf, "<numad nodeset='%s'/>\n", nodeset);
VIR_FREE(nodeset);
}
/* Various per-domain paths */ /* Various per-domain paths */
virBufferEscapeString(buf, "<libDir path='%s'/>\n", priv->libDir); virBufferEscapeString(buf, "<libDir path='%s'/>\n", priv->libDir);
...@@ -1935,6 +1951,40 @@ qemuDomainObjPrivateXMLParseVcpu(xmlNodePtr node, ...@@ -1935,6 +1951,40 @@ qemuDomainObjPrivateXMLParseVcpu(xmlNodePtr node,
} }
static int
qemuDomainObjPrivateXMLParseAutomaticPlacement(xmlXPathContextPtr ctxt,
qemuDomainObjPrivatePtr priv,
virQEMUDriverPtr driver)
{
virCapsPtr caps = NULL;
char *nodeset;
int ret = -1;
nodeset = virXPathString("string(./numad/@nodeset)", ctxt);
if (!nodeset)
return 0;
if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
goto cleanup;
if (virBitmapParse(nodeset, &priv->autoNodeset, caps->host.nnumaCell_max) < 0)
goto cleanup;
if (!(priv->autoCpuset = virCapabilitiesGetCpusForNodemask(caps,
priv->autoNodeset)))
goto cleanup;
ret = 0;
cleanup:
virObjectUnref(caps);
VIR_FREE(nodeset);
return ret;
}
static int static int
qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
virDomainObjPtr vm, virDomainObjPtr vm,
...@@ -1949,7 +1999,6 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, ...@@ -1949,7 +1999,6 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
xmlNodePtr *nodes = NULL; xmlNodePtr *nodes = NULL;
xmlNodePtr node = NULL; xmlNodePtr node = NULL;
virQEMUCapsPtr qemuCaps = NULL; virQEMUCapsPtr qemuCaps = NULL;
virCapsPtr caps = NULL;
if (VIR_ALLOC(priv->monConfig) < 0) if (VIR_ALLOC(priv->monConfig) < 0)
goto error; goto error;
...@@ -2133,21 +2182,9 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, ...@@ -2133,21 +2182,9 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
} }
VIR_FREE(nodes); VIR_FREE(nodes);
if (!(caps = virQEMUDriverGetCapabilities(driver, false))) if (qemuDomainObjPrivateXMLParseAutomaticPlacement(ctxt, priv, driver) < 0)
goto error; goto error;
if ((tmp = virXPathString("string(./numad/@nodeset)", ctxt))) {
if (virBitmapParse(tmp, &priv->autoNodeset,
caps->host.nnumaCell_max) < 0)
goto error;
if (!(priv->autoCpuset = virCapabilitiesGetCpusForNodemask(caps,
priv->autoNodeset)))
goto error;
}
virObjectUnref(caps);
VIR_FREE(tmp);
if ((tmp = virXPathString("string(./libDir/@path)", ctxt))) if ((tmp = virXPathString("string(./libDir/@path)", ctxt)))
priv->libDir = tmp; priv->libDir = tmp;
if ((tmp = virXPathString("string(./channelTargetDir/@path)", ctxt))) if ((tmp = virXPathString("string(./channelTargetDir/@path)", ctxt)))
...@@ -2175,7 +2212,6 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, ...@@ -2175,7 +2212,6 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
virStringListFree(priv->qemuDevices); virStringListFree(priv->qemuDevices);
priv->qemuDevices = NULL; priv->qemuDevices = NULL;
virObjectUnref(qemuCaps); virObjectUnref(qemuCaps);
virObjectUnref(caps);
return -1; return -1;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册