[libvirt] [PATCH 4/5] conf: Refactor virDomainVcpuPinDefParseXML

Peter Krempa pkrempa at redhat.com
Tue Apr 7 18:50:03 UTC 2015


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




More information about the libvir-list mailing list