diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 22e83a1ee5..b17295a35f 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13173,30 +13173,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
*
- *
- * and emulatorpin has the form of
- *
- *
- * and an iothreadspin has the form
- *
- *
- * 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;
@@ -13205,28 +13194,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;
- }
-
- if (vcpuid >= maxvcpus) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("vcpu id must be less than maxvcpus"));
- goto error;
- }
-
- def->id = vcpuid;
+ 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 (iothreads && (tmp = virXPathString("string(./@iothread)", ctxt))) {
+ 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",
+ _("missing cpuset for vcpupin"));
+
+ goto error;
+ }
+
+ 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
+ *
+ */
+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);
@@ -13240,11 +13267,9 @@ virDomainVcpuPinDefParseXML(xmlNodePtr node,
goto error;
}
- /* NB: maxvcpus is actually def->iothreads
- * IOThreads are numbered "iothread1...iothread", where
- * "n" is the iothreads value
- */
- if (iothreadid > maxvcpus) {
+ /* IOThreads are numbered "iothread1...iothread", where
+ * "n" is the iothreads value */
+ if (iothreadid > iothreads) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("iothread id must not exceed iothreads"));
goto error;
@@ -13254,13 +13279,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;
}
@@ -13285,6 +13305,7 @@ virDomainVcpuPinDefParseXML(xmlNodePtr node,
}
+
/* Parse the XML definition for emulatorpin.
* emulatorpin has the form of
*
@@ -14011,7 +14032,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;
@@ -14098,9 +14119,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;