]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Figure out nodeset bitmap size correctly
authorAndrea Bolognani <abologna@redhat.com>
Tue, 10 Apr 2018 14:12:05 +0000 (16:12 +0200)
committerAndrea Bolognani <abologna@redhat.com>
Thu, 19 Apr 2018 15:57:54 +0000 (17:57 +0200)
The current private XML parsing code relies on the assumption
that NUMA node IDs start from 0 and are densely allocated,
neither of which is necessarily the case.

Change it so that the bitmap size is dynamically calculated by
looking at NUMA node IDs instead, which ensures all nodes will
be able to fit and thus the bitmap will be parsed successfully.

Update one of the test cases so that it would fail with the
previous approach, but passes with the new one.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1490158

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_domain.c
tests/qemustatusxml2xmldata/modern-in.xml

index 4c62a44449436ede5a5d7314670aa5a0c024a931..326c939c85c0fa405f51ebf7619a20f68123c368 100644 (file)
@@ -2236,6 +2236,8 @@ qemuDomainObjPrivateXMLParseAutomaticPlacement(xmlXPathContextPtr ctxt,
     virCapsPtr caps = NULL;
     char *nodeset;
     char *cpuset;
+    int nodesetSize = 0;
+    size_t i;
     int ret = -1;
 
     nodeset = virXPathString("string(./numad/@nodeset)", ctxt);
@@ -2247,8 +2249,14 @@ qemuDomainObjPrivateXMLParseAutomaticPlacement(xmlXPathContextPtr ctxt,
     if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
         goto cleanup;
 
+    /* Figure out how big the nodeset bitmap needs to be.
+     * This is necessary because NUMA node IDs are not guaranteed to
+     * start from 0 or be densely allocated */
+    for (i = 0; i < caps->host.nnumaCell; i++)
+        nodesetSize = MAX(nodesetSize, caps->host.numaCell[i]->num + 1);
+
     if (nodeset &&
-        virBitmapParse(nodeset, &priv->autoNodeset, caps->host.nnumaCell_max) < 0)
+        virBitmapParse(nodeset, &priv->autoNodeset, nodesetSize) < 0)
         goto cleanup;
 
     if (cpuset) {
index 2e166e6e674c948eb6b6fc68b5df67df20ef69e9..c1e57618b6973a916e9131814b32809843558ed3 100644 (file)
     <device alias='usb'/>
     <device alias='ide0-0-0'/>
   </devices>
-  <numad nodeset='0' cpuset='0-7'/>
+  <numad nodeset='6' cpuset='0-7'/>
   <libDir path='/var/lib/libvirt/qemu/domain-1-upstream'/>
   <channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-1-upstream'/>
   <chardevStdioLogd/>