Refactor the code to parse the vcpupin in a similar way the iothreadpin code is now structured. This allows to get rid of some very strange conditions and error messages. Additionally since a existing bug ( https://bugzilla.redhat.com/show_bug.cgi?id=1208434 ) allows to add vcpupin definitions for vcpus that don't exist, this patch makes the parser to ignore all vcpupins that don't have a matching vCPU in the definition rather than just offlined ones. --- src/conf/domain_conf.c | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 2ebd714..ddc0bf8 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13160,36 +13160,30 @@ virDomainIdmapDefParseXML(xmlXPathContextPtr ctxt, */ static virDomainPinDefPtr virDomainVcpuPinDefParseXML(xmlNodePtr node, - xmlXPathContextPtr ctxt, - int maxvcpus) + xmlXPathContextPtr ctxt) { virDomainPinDefPtr def; xmlNodePtr oldnode = ctxt->node; - int vcpuid = -1; + unsigned int vcpuid; char *tmp = NULL; - int ret; if (VIR_ALLOC(def) < 0) return NULL; ctxt->node = node; - 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")); + if (!(tmp = virXPathString("string(./@vcpu)", ctxt))) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("missing vcpu id in vcpupin")); goto error; } - if (vcpuid >= maxvcpus) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("vcpu id must be less than maxvcpus")); + if (virStrToLong_uip(tmp, NULL, 10, &vcpuid) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("invalid setting for vcpu '%s'"), tmp); goto error; } + VIR_FREE(tmp); def->id = vcpuid; @@ -13993,11 +13987,8 @@ virDomainDefParseXML(xmlDocPtr xml, goto error; for (i = 0; i < n; i++) { - virDomainPinDefPtr vcpupin = NULL; - vcpupin = virDomainVcpuPinDefParseXML(nodes[i], ctxt, - def->maxvcpus); - - if (!vcpupin) + virDomainPinDefPtr vcpupin; + if (!(vcpupin = virDomainVcpuPinDefParseXML(nodes[i], ctxt))) goto error; if (virDomainPinIsDuplicate(def->cputune.vcpupin, @@ -14015,7 +14006,7 @@ virDomainDefParseXML(xmlDocPtr xml, * <vcpupin> nodes greater than current vcpus, * ignoring them instead. */ - VIR_WARN("Ignore vcpupin for not onlined vcpus"); + VIR_WARN("Ignore vcpupin for missing vcpus"); virDomainPinDefFree(vcpupin); } else { def->cputune.vcpupin[def->cputune.nvcpupin++] = vcpupin; -- 2.2.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list