From e04d1074f801a211e2767545e2816cc98d820dd3 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 12 Jul 2017 13:59:35 +0200 Subject: [PATCH] qemu: process: Don't put memoryless NUMA nodes into autoNodeset 'numad' may return a nodeset which contains NUMA nodes without memory for certain configurations. Since cgroups code will not be happy using nodes without memory we need to store only numa nodes with memory in autoNodeset. On the other hand autoCpuset should contain cpus also for nodes which do not have any memory. --- src/qemu/qemu_process.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 4038d1780f..525521aaf0 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5174,6 +5174,8 @@ qemuProcessPrepareDomainNUMAPlacement(virDomainObjPtr vm, { qemuDomainObjPrivatePtr priv = vm->privateData; char *nodeset = NULL; + virBitmapPtr numadNodeset = NULL; + virBitmapPtr hostMemoryNodeset = NULL; int ret = -1; /* Get the advisory nodeset from numad if 'placement' of @@ -5188,19 +5190,30 @@ qemuProcessPrepareDomainNUMAPlacement(virDomainObjPtr vm, if (!nodeset) goto cleanup; + if (!(hostMemoryNodeset = virNumaGetHostMemoryNodeset())) + goto cleanup; + VIR_DEBUG("Nodeset returned from numad: %s", nodeset); - if (virBitmapParse(nodeset, &priv->autoNodeset, VIR_DOMAIN_CPUMASK_LEN) < 0) + if (virBitmapParse(nodeset, &numadNodeset, VIR_DOMAIN_CPUMASK_LEN) < 0) goto cleanup; - if (!(priv->autoCpuset = virCapabilitiesGetCpusForNodemask(caps, - priv->autoNodeset))) + /* numad may return a nodeset that only contains cpus but cgroups don't play + * well with that. Set the autoCpuset from all cpus from that nodeset, but + * assign autoNodeset only with nodes containing memory. */ + if (!(priv->autoCpuset = virCapabilitiesGetCpusForNodemask(caps, numadNodeset))) goto cleanup; + virBitmapIntersect(numadNodeset, hostMemoryNodeset); + + VIR_STEAL_PTR(priv->autoNodeset, numadNodeset); + ret = 0; cleanup: VIR_FREE(nodeset); + virBitmapFree(numadNodeset); + virBitmapFree(hostMemoryNodeset); return ret; } -- GitLab