1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-01-03 05:17:54 +03:00

tests: Create full host NUMA topology in more cases

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>
This commit is contained in:
Andrea Bolognani 2018-04-10 17:42:14 +02:00
parent 888aa4b6b9
commit 4fe4ffdbdf
4 changed files with 64 additions and 62 deletions

View File

@ -1228,6 +1228,57 @@ virCapsPtr virTestGenericCapsInit(void)
return NULL; 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 = { static virDomainDefParserConfig virTestGenericDomainDefParserConfig = {
.features = VIR_DOMAIN_DEF_FEATURE_INDIVIDUAL_VCPUS, .features = VIR_DOMAIN_DEF_FEATURE_INDIVIDUAL_VCPUS,
}; };

View File

@ -147,6 +147,8 @@ int virTestMain(int argc,
} }
virCapsPtr virTestGenericCapsInit(void); virCapsPtr virTestGenericCapsInit(void);
int virTestCapsBuildNUMATopology(virCapsPtr caps,
int seq);
virDomainXMLOptionPtr virTestGenericDomainXMLConfInit(void); virDomainXMLOptionPtr virTestGenericDomainXMLConfInit(void);
typedef enum { typedef enum {

View File

@ -400,7 +400,12 @@ virCapsPtr testQemuCapsInit(void)
qemuTestSetHostCPU(caps, NULL); 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) if (testQemuAddI686Guest(caps) < 0)
goto cleanup; goto cleanup;

View File

@ -29,62 +29,6 @@
#define VIR_FROM_THIS VIR_FROM_NONE #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 static int
test_virCapabilitiesGetCpusForNodemask(const void *data ATTRIBUTE_UNUSED) test_virCapabilitiesGetCpusForNodemask(const void *data ATTRIBUTE_UNUSED)
@ -96,11 +40,11 @@ test_virCapabilitiesGetCpusForNodemask(const void *data ATTRIBUTE_UNUSED)
int mask_size = 8; int mask_size = 8;
int ret = -1; int ret = -1;
/*
* Build a NUMA topology with cell_id (NUMA node id if (!(caps = virCapabilitiesNew(VIR_ARCH_X86_64, false, false)))
* being 3(0 + 3),4(1 + 3), 5 and 6 goto error;
*/
if (!(caps = buildNUMATopology(3))) if (virTestCapsBuildNUMATopology(caps, 3) < 0)
goto error; goto error;
if (virBitmapParse(nodestr, &nodemask, mask_size) < 0) if (virBitmapParse(nodestr, &nodemask, mask_size) < 0)