
On 04/07/2015 02:50 PM, Peter Krempa wrote:
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
[set bikeshed=flog... technically the above would go in patch 1, but I'm not concerned due to where this is headed... same in about 4 lines ]
* * 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)
s/Iothread/IOThread/ ACK with this John
+{ + 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;