From 3f9fb2b5871cbd252af592cb210bb46fd7f57d23 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 7 Apr 2015 20:09:04 +0200 Subject: [PATCH] conf: Refactor virDomainVcpuPinDefParseXML 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 39eb050b32..4d7e3c9edb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13180,36 +13180,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; @@ -14034,11 +14028,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, @@ -14056,7 +14047,7 @@ virDomainDefParseXML(xmlDocPtr xml, * 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.39.5