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