[libvirt] [PATCH 2/5] conf: Split up virDomainVcpuPinDefParseXML

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


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
  *
  * 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)
+{
+    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;

-- 
2.2.2




More information about the libvir-list mailing list