]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: domain: Store and restore autoCpuset to status XML
authorPeter Krempa <pkrempa@redhat.com>
Wed, 12 Jul 2017 12:10:34 +0000 (14:10 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 20 Jul 2017 14:14:50 +0000 (16:14 +0200)
Decouple them by storing them in the XML separately rather than
regenerating them. This will simplify upcoming fixes.

src/qemu/qemu_domain.c
tests/qemuxml2xmltest.c

index 23d4b203594abb652461a8854ef35650cf9cf1a1..ede761e6ef666ae8ca36f18853b68f2920374c25 100644 (file)
@@ -1765,20 +1765,30 @@ qemuDomainObjPtrivateXMLFormatAutomaticPlacement(virBufferPtr buf,
                                                  qemuDomainObjPrivatePtr priv)
 {
     char *nodeset = NULL;
+    char *cpuset = NULL;
     int ret = -1;
 
-    if (!priv->autoNodeset)
+    if (!priv->autoNodeset && !priv->autoCpuset)
         return 0;
 
-    if (!(nodeset = virBitmapFormat(priv->autoNodeset)))
+    if (priv->autoNodeset &&
+        !((nodeset = virBitmapFormat(priv->autoNodeset))))
         goto cleanup;
 
-    virBufferAsprintf(buf, "<numad nodeset='%s'/>\n", nodeset);
+    if (priv->autoCpuset &&
+        !((cpuset = virBitmapFormat(priv->autoCpuset))))
+        goto cleanup;
+
+    virBufferAddLit(buf, "<numad");
+    virBufferEscapeString(buf, " nodeset='%s'", nodeset);
+    virBufferEscapeString(buf, " cpuset='%s'", cpuset);
+    virBufferAddLit(buf, "/>\n");
 
     ret = 0;
 
  cleanup:
     VIR_FREE(nodeset);
+    VIR_FREE(cpuset);
     return ret;
 }
 
@@ -1958,28 +1968,39 @@ qemuDomainObjPrivateXMLParseAutomaticPlacement(xmlXPathContextPtr ctxt,
 {
     virCapsPtr caps = NULL;
     char *nodeset;
+    char *cpuset;
     int ret = -1;
 
     nodeset = virXPathString("string(./numad/@nodeset)", ctxt);
+    cpuset = virXPathString("string(./numad/@cpuset)", ctxt);
 
-    if (!nodeset)
+    if (!nodeset && !cpuset)
         return 0;
 
     if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
         goto cleanup;
 
-    if (virBitmapParse(nodeset, &priv->autoNodeset, caps->host.nnumaCell_max) < 0)
+    if (nodeset &&
+        virBitmapParse(nodeset, &priv->autoNodeset, caps->host.nnumaCell_max) < 0)
         goto cleanup;
 
-    if (!(priv->autoCpuset = virCapabilitiesGetCpusForNodemask(caps,
-                                                               priv->autoNodeset)))
-        goto cleanup;
+    if (cpuset) {
+        if (virBitmapParse(cpuset, &priv->autoCpuset, VIR_DOMAIN_CPUMASK_LEN) < 0)
+            goto cleanup;
+    } else {
+        /* autoNodeset is present in this case, since otherwise we wouldn't
+         * reach this code */
+        if (!(priv->autoCpuset = virCapabilitiesGetCpusForNodemask(caps,
+                                                                   priv->autoNodeset)))
+            goto cleanup;
+    }
 
     ret = 0;
 
  cleanup:
     virObjectUnref(caps);
     VIR_FREE(nodeset);
+    VIR_FREE(cpuset);
 
     return ret;
 }
index 5e4b1d17f6cecf194d954dc71a483a00d1527251..bc222cf793b8ac183e50ff8ca0fc2b9a00cf48e5 100644 (file)
@@ -95,7 +95,7 @@ static const char testStatusXMLPrefixFooter[] =
 "    <device alias='net0'/>\n"
 "    <device alias='usb'/>\n"
 "  </devices>\n"
-"  <numad nodeset='0-2'/>\n"
+"  <numad nodeset='0-2' cpuset='1,3'/>\n"
 "  <libDir path='/tmp'/>\n"
 "  <channelTargetDir path='/tmp/channel'/>\n";