]> xenbits.xensource.com Git - libvirt.git/commitdiff
tests: Create full host NUMA topology in more cases
authorAndrea Bolognani <abologna@redhat.com>
Tue, 10 Apr 2018 15:42:14 +0000 (17:42 +0200)
committerAndrea Bolognani <abologna@redhat.com>
Thu, 19 Apr 2018 15:57:52 +0000 (17:57 +0200)
vircapstest has code to add a full host NUMA topology, that
is, one that includes all information about nodes and CPUs
including IDs; testQemuCapsInit(), which is used to create a
mock virCapsPtr for QEMU tests, however, just fakes it by
setting nnumaCell_max to some number.

While the latter approach has served us well so far, we're
going to need all the information to be filled in soon. In
order to do that, we can just move the existing code from
vircapstest to testutils and, with some renaming and
trivial tweaking, use it as-is.

Interestingly, the NUMA topology generated by the function
is rigged up so that the NUMA nodes aren't (necessarily)
numbered starting from 0, which is a nice way to spot
mistaken assumptions in our codebase.

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
tests/testutils.c
tests/testutils.h
tests/testutilsqemu.c
tests/vircapstest.c

index 7c095caac94a4b59df33b9f5fc57a54a0f79da12..4b13d112788a7c2e173c0ac9653ddca9371a84f4 100644 (file)
@@ -1228,6 +1228,57 @@ virCapsPtr virTestGenericCapsInit(void)
     return NULL;
 }
 
+
+#define MAX_CELLS 4
+#define MAX_CPUS_IN_CELL 2
+#define MAX_MEM_IN_CELL 2097152
+
+/*
+ * Build NUMA topology with cell id starting from (0 + seq)
+ * for testing
+ */
+int
+virTestCapsBuildNUMATopology(virCapsPtr caps,
+                             int seq)
+{
+    virCapsHostNUMACellCPUPtr cell_cpus = NULL;
+    int core_id, cell_id;
+    int id;
+
+    id = 0;
+    for (cell_id = 0; cell_id < MAX_CELLS; cell_id++) {
+        if (VIR_ALLOC_N(cell_cpus, MAX_CPUS_IN_CELL) < 0)
+            goto error;
+
+        for (core_id = 0; core_id < MAX_CPUS_IN_CELL; core_id++) {
+            cell_cpus[core_id].id = id + core_id;
+            cell_cpus[core_id].socket_id = cell_id + seq;
+            cell_cpus[core_id].core_id = id + core_id;
+            if (!(cell_cpus[core_id].siblings =
+                  virBitmapNew(MAX_CPUS_IN_CELL)))
+                goto error;
+            ignore_value(virBitmapSetBit(cell_cpus[core_id].siblings, id));
+        }
+        id++;
+
+        if (virCapabilitiesAddHostNUMACell(caps, cell_id + seq,
+                                           MAX_MEM_IN_CELL,
+                                           MAX_CPUS_IN_CELL, cell_cpus,
+                                           VIR_ARCH_NONE, NULL,
+                                           VIR_ARCH_NONE, NULL) < 0)
+           goto error;
+
+        cell_cpus = NULL;
+    }
+
+    return 0;
+
+ error:
+    virCapabilitiesClearHostNUMACellCPUTopology(cell_cpus, MAX_CPUS_IN_CELL);
+    VIR_FREE(cell_cpus);
+    return -1;
+}
+
 static virDomainDefParserConfig virTestGenericDomainDefParserConfig = {
     .features = VIR_DOMAIN_DEF_FEATURE_INDIVIDUAL_VCPUS,
 };
index d840875bc159ee5726027262696254a3e3dc3861..3bd7bf16034fbb90e95acae9edc4d48a77c22211 100644 (file)
@@ -147,6 +147,8 @@ int virTestMain(int argc,
     }
 
 virCapsPtr virTestGenericCapsInit(void);
+int virTestCapsBuildNUMATopology(virCapsPtr caps,
+                                 int seq);
 virDomainXMLOptionPtr virTestGenericDomainXMLConfInit(void);
 
 typedef enum {
index 3222d7864cf1e033d1dfe4b79611df072118af5d..dc7e90b9521226731df69e751e35299a9e8b227e 100644 (file)
@@ -400,7 +400,12 @@ virCapsPtr testQemuCapsInit(void)
 
     qemuTestSetHostCPU(caps, NULL);
 
-    caps->host.nnumaCell_max = 4;
+    /*
+     * Build a NUMA topology with cell_id (NUMA node id
+     * being 3(0 + 3),4(1 + 3), 5 and 6
+     */
+    if (virTestCapsBuildNUMATopology(caps, 3) < 0)
+        goto cleanup;
 
     if (testQemuAddI686Guest(caps) < 0)
         goto cleanup;
index 664b7da1433b5add023f402bdecdd8974933f2a1..1df3fa091f5ca174c2a8185b22efe043bdb607d6 100644 (file)
 
 #define VIR_FROM_THIS VIR_FROM_NONE
 
-#define MAX_CELLS 4
-#define MAX_CPUS_IN_CELL 2
-#define MAX_MEM_IN_CELL 2097152
-
-
-/*
- * Build  NUMA Toplogy with cell id starting from (0 + seq)
- * for testing
- */
-static virCapsPtr
-buildNUMATopology(int seq)
-{
-    virCapsPtr caps;
-    virCapsHostNUMACellCPUPtr cell_cpus = NULL;
-    int core_id, cell_id;
-    int id;
-
-    if ((caps = virCapabilitiesNew(VIR_ARCH_X86_64, false, false)) == NULL)
-        goto error;
-
-    id = 0;
-    for (cell_id = 0; cell_id < MAX_CELLS; cell_id++) {
-        if (VIR_ALLOC_N(cell_cpus, MAX_CPUS_IN_CELL) < 0)
-            goto error;
-
-        for (core_id = 0; core_id < MAX_CPUS_IN_CELL; core_id++) {
-            cell_cpus[core_id].id = id + core_id;
-            cell_cpus[core_id].socket_id = cell_id + seq;
-            cell_cpus[core_id].core_id = id + core_id;
-            if (!(cell_cpus[core_id].siblings =
-                  virBitmapNew(MAX_CPUS_IN_CELL)))
-                goto error;
-            ignore_value(virBitmapSetBit(cell_cpus[core_id].siblings, id));
-        }
-        id++;
-
-        if (virCapabilitiesAddHostNUMACell(caps, cell_id + seq,
-                                           MAX_MEM_IN_CELL,
-                                           MAX_CPUS_IN_CELL, cell_cpus,
-                                           VIR_ARCH_NONE, NULL,
-                                           VIR_ARCH_NONE, NULL) < 0)
-           goto error;
-
-        cell_cpus = NULL;
-    }
-
-    return caps;
-
- error:
-    virCapabilitiesClearHostNUMACellCPUTopology(cell_cpus, MAX_CPUS_IN_CELL);
-    VIR_FREE(cell_cpus);
-    virObjectUnref(caps);
-    return NULL;
-
-}
-
 
 static int
 test_virCapabilitiesGetCpusForNodemask(const void *data ATTRIBUTE_UNUSED)
@@ -96,11 +40,11 @@ test_virCapabilitiesGetCpusForNodemask(const void *data ATTRIBUTE_UNUSED)
     int mask_size = 8;
     int ret = -1;
 
-    /*
-     * Build a NUMA topology with cell_id (NUMA node id
-     * being 3(0 + 3),4(1 + 3), 5 and 6
-     */
-    if (!(caps = buildNUMATopology(3)))
+
+    if (!(caps = virCapabilitiesNew(VIR_ARCH_X86_64, false, false)))
+        goto error;
+
+    if (virTestCapsBuildNUMATopology(caps, 3) < 0)
         goto error;
 
     if (virBitmapParse(nodestr, &nodemask, mask_size) < 0)