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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list