7a3408
From c2e77e9c6e246a254083ac0e30c9b0da209daac2 Mon Sep 17 00:00:00 2001
7a3408
Message-Id: <c2e77e9c6e246a254083ac0e30c9b0da209daac2@dist-git>
7a3408
From: Martin Kletzander <mkletzan@redhat.com>
7a3408
Date: Thu, 13 Aug 2015 15:11:47 +0200
7a3408
Subject: [PATCH] qemu: Keep numad hint after daemon restart
7a3408
7a3408
https://bugzilla.redhat.com/show_bug.cgi?id=1162947
7a3408
7a3408
The numad hint stored in priv->autoNodeset is information that gets lost
7a3408
during daemon restart.  And because we would like to use that
7a3408
information in the future, we also need to save it in the status XML.
7a3408
For the sake of tests, we need to initialize nnumaCell_max to some
7a3408
value, so that the restoration doesn't fail in our test suite.  There is
7a3408
no need to fill in the actual numa cell data since the recalculating
7a3408
function virCapabilitiesGetCpusForNodemask() will not fail, it will just
7a3408
skip filling the data in the bitmap which we don't use in tests anyway.
7a3408
7a3408
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
7a3408
(cherry picked from commit 8ce86722d78d8b2a1e7d9cb29571beb791c9f3d7)
7a3408
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
7a3408
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
7a3408
---
7a3408
 src/qemu/qemu_domain.c  | 32 +++++++++++++++++++++++++++++++-
7a3408
 tests/qemuxml2xmltest.c |  3 ++-
7a3408
 tests/testutilsqemu.c   |  2 ++
7a3408
 3 files changed, 35 insertions(+), 2 deletions(-)
7a3408
7a3408
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
7a3408
index ca41ca4..3b542f5 100644
7a3408
--- a/src/qemu/qemu_domain.c
7a3408
+++ b/src/qemu/qemu_domain.c
7a3408
@@ -618,21 +618,33 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf,
7a3408
         virBufferAddLit(buf, "</devices>\n");
7a3408
     }
7a3408
 
7a3408
+    if (priv->autoNodeset) {
7a3408
+        char *nodeset = virBitmapFormat(priv->autoNodeset);
7a3408
+
7a3408
+        if (!nodeset)
7a3408
+            return -1;
7a3408
+
7a3408
+        virBufferAsprintf(buf, "<numad nodeset='%s'/>\n", nodeset);
7a3408
+        VIR_FREE(nodeset);
7a3408
+    }
7a3408
+
7a3408
     return 0;
7a3408
 }
7a3408
 
7a3408
 static int
7a3408
 qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
7a3408
                              virDomainObjPtr vm,
7a3408
-                             virDomainDefParserConfigPtr config ATTRIBUTE_UNUSED)
7a3408
+                             virDomainDefParserConfigPtr config)
7a3408
 {
7a3408
     qemuDomainObjPrivatePtr priv = vm->privateData;
7a3408
+    virQEMUDriverPtr driver = config->priv;
7a3408
     char *monitorpath;
7a3408
     char *tmp = NULL;
7a3408
     int n;
7a3408
     size_t i;
7a3408
     xmlNodePtr *nodes = NULL;
7a3408
     virQEMUCapsPtr qemuCaps = NULL;
7a3408
+    virCapsPtr caps = NULL;
7a3408
 
7a3408
     if (VIR_ALLOC(priv->monConfig) < 0)
7a3408
         goto error;
7a3408
@@ -805,15 +817,33 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
7a3408
     }
7a3408
     VIR_FREE(nodes);
7a3408
 
7a3408
+    if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
7a3408
+        goto error;
7a3408
+
7a3408
+    if ((tmp = virXPathString("string(./numad/@nodeset)", ctxt))) {
7a3408
+        if (virBitmapParse(tmp, 0, &priv->autoNodeset,
7a3408
+                           caps->host.nnumaCell_max) < 0)
7a3408
+            goto error;
7a3408
+
7a3408
+        if (!(priv->autoCpuset = virCapabilitiesGetCpusForNodemask(caps,
7a3408
+                                                                   priv->autoNodeset)))
7a3408
+            goto error;
7a3408
+    }
7a3408
+    virObjectUnref(caps);
7a3408
+    caps = NULL;
7a3408
+    VIR_FREE(tmp);
7a3408
+
7a3408
     return 0;
7a3408
 
7a3408
  error:
7a3408
     virDomainChrSourceDefFree(priv->monConfig);
7a3408
     priv->monConfig = NULL;
7a3408
     VIR_FREE(nodes);
7a3408
+    VIR_FREE(tmp);
7a3408
     virStringFreeList(priv->qemuDevices);
7a3408
     priv->qemuDevices = NULL;
7a3408
     virObjectUnref(qemuCaps);
7a3408
+    virObjectUnref(caps);
7a3408
     return -1;
7a3408
 }
7a3408
 
7a3408
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
7a3408
index 7a41a18..09806b2 100644
7a3408
--- a/tests/qemuxml2xmltest.c
7a3408
+++ b/tests/qemuxml2xmltest.c
7a3408
@@ -130,7 +130,8 @@ static const char testStatusXMLPrefix[] =
7a3408
 "    <device alias='serial0'/>\n"
7a3408
 "    <device alias='net0'/>\n"
7a3408
 "    <device alias='usb'/>\n"
7a3408
-"  </devices>\n";
7a3408
+"  </devices>\n"
7a3408
+"  <numad nodeset='0-2'/>\n";
7a3408
 
7a3408
 static const char testStatusXMLSuffix[] =
7a3408
 "</domstatus>\n";
7a3408
diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
7a3408
index ceaabb6..a2f4299 100644
7a3408
--- a/tests/testutilsqemu.c
7a3408
+++ b/tests/testutilsqemu.c
7a3408
@@ -336,6 +336,8 @@ virCapsPtr testQemuCapsInit(void)
7a3408
 
7a3408
     caps->host.cpu = cpuDefault;
7a3408
 
7a3408
+    caps->host.nnumaCell_max = 4;
7a3408
+
7a3408
     if ((machines = testQemuAllocMachines(&nmachines)) == NULL)
7a3408
         goto cleanup;
7a3408
 
7a3408
-- 
7a3408
2.5.0
7a3408