Extract part that parses iothreads into virDomainIothreadPinDefParseXML
---
src/conf/domain_conf.c | 112 +++++++++++++++++++++++++++++--------------------
1 file changed, 66 insertions(+), 46 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index ec7f9c9..10ec17a 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13153,30 +13153,19 @@ virDomainIdmapDefParseXML(xmlXPathContextPtr ctxt,
return idmap;
}
-/* Parse the XML definition for a vcpupin or emulatorpin.
+/* Parse the XML definition for a vcpupin
*
* vcpupin has the form of
* <vcpupin vcpu='0' cpuset='0'/>
- *
- * and emulatorpin has the form of
- * <emulatorpin cpuset='0'/>
- *
- * and an iothreadspin has the form
- * <iothreadpin iothread='1' cpuset='2'/>
- *
- * A vcpuid of -1 is valid and only valid for emulatorpin. So callers
- * have to check the returned cpuid for validity.
*/
static virDomainPinDefPtr
virDomainVcpuPinDefParseXML(xmlNodePtr node,
xmlXPathContextPtr ctxt,
- int maxvcpus,
- bool iothreads)
+ int maxvcpus)
{
virDomainPinDefPtr def;
xmlNodePtr oldnode = ctxt->node;
int vcpuid = -1;
- unsigned int iothreadid;
char *tmp = NULL;
int ret;
@@ -13185,28 +13174,66 @@ virDomainVcpuPinDefParseXML(xmlNodePtr node,
ctxt->node = node;
- if (!iothreads) {
- ret = virXPathInt("string(./@vcpu)", ctxt, &vcpuid);
- if ((ret == -2) || (vcpuid < -1)) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("vcpu id must be an unsigned integer or -1"));
- goto error;
- } else if (vcpuid == -1) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("vcpu id value -1 is not allowed for vcpupin"));
- goto error;
- }
+ ret = virXPathInt("string(./@vcpu)", ctxt, &vcpuid);
+ if ((ret == -2) || (vcpuid < -1)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("vcpu id must be an unsigned integer or -1"));
+ goto error;
+ } else if (vcpuid == -1) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("vcpu id value -1 is not allowed for vcpupin"));
+ goto error;
+ }
- if (vcpuid >= maxvcpus) {
+ if (vcpuid >= maxvcpus) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("vcpu id must be less than maxvcpus"));
+ goto error;
+ }
+
+ def->id = vcpuid;
+
+ if (!(tmp = virXMLPropString(node, "cpuset"))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("vcpu id must be less than maxvcpus"));
- goto error;
- }
+ _("missing cpuset for vcpupin"));
- def->id = vcpuid;
+ goto error;
}
- if (iothreads && (tmp = virXPathString("string(./@iothread)",
ctxt))) {
+ if (virBitmapParse(tmp, 0, &def->cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0)
+ goto error;
+
+ cleanup:
+ VIR_FREE(tmp);
+ ctxt->node = oldnode;
+ return def;
+
+ error:
+ VIR_FREE(def);
+ goto cleanup;
+}
+
+
+/* Parse the XML definition for a iothreadpin
+ * and an iothreadspin has the form
+ * <iothreadpin iothread='1' cpuset='2'/>
+ */
+static virDomainPinDefPtr
+virDomainIothreadPinDefParseXML(xmlNodePtr node,
+ xmlXPathContextPtr ctxt,
+ int iothreads)
+{
+ virDomainPinDefPtr def;
+ xmlNodePtr oldnode = ctxt->node;
+ unsigned int iothreadid;
+ char *tmp = NULL;
+
+ if (VIR_ALLOC(def) < 0)
+ return NULL;
+
+ ctxt->node = node;
+
+ if ((tmp = virXPathString("string(./@iothread)", ctxt))) {
if (virStrToLong_uip(tmp, NULL, 10, &iothreadid) < 0) {
virReportError(VIR_ERR_XML_ERROR,
_("invalid setting for iothread '%s'"),
tmp);
@@ -13220,11 +13247,9 @@ virDomainVcpuPinDefParseXML(xmlNodePtr node,
goto error;
}
- /* NB: maxvcpus is actually def->iothreads
- * IOThreads are numbered "iothread1...iothread<n>", where
- * "n" is the iothreads value
- */
- if (iothreadid > maxvcpus) {
+ /* IOThreads are numbered "iothread1...iothread<n>", where
+ * "n" is the iothreads value */
+ if (iothreadid > iothreads) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("iothread id must not exceed iothreads"));
goto error;
@@ -13234,13 +13259,8 @@ virDomainVcpuPinDefParseXML(xmlNodePtr node,
}
if (!(tmp = virXMLPropString(node, "cpuset"))) {
- if (iothreads)
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("missing cpuset for iothreadpin"));
- else
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("missing cpuset for vcpupin"));
-
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing cpuset for iothreadpin"));
goto error;
}
@@ -13258,6 +13278,7 @@ virDomainVcpuPinDefParseXML(xmlNodePtr node,
}
+
/* Parse the XML definition for emulatorpin.
* emulatorpin has the form of
* <emulatorpin cpuset='0'/>
@@ -13970,7 +13991,7 @@ virDomainDefParseXML(xmlDocPtr xml,
for (i = 0; i < n; i++) {
virDomainPinDefPtr vcpupin = NULL;
vcpupin = virDomainVcpuPinDefParseXML(nodes[i], ctxt,
- def->maxvcpus, false);
+ def->maxvcpus);
if (!vcpupin)
goto error;
@@ -14057,9 +14078,8 @@ virDomainDefParseXML(xmlDocPtr xml,
for (i = 0; i < n; i++) {
virDomainPinDefPtr iothreadpin = NULL;
- iothreadpin = virDomainVcpuPinDefParseXML(nodes[i], ctxt,
- def->iothreads,
- true);
+ iothreadpin = virDomainIothreadPinDefParseXML(nodes[i], ctxt,
+ def->iothreads);
if (!iothreadpin)
goto error;
--
2.2.2