提交 cd921cf0 编写于 作者: P Pradipta Kr. Banerjee 提交者: Daniel P. Berrange

Handle non-sequential NUMA node numbers

On some platforms like IBM PowerNV the NUMA node numbers can be
non-sequential. For eg. numactl --hardware o/p from such a machine looks
as given below

node distances:
   node   0   1  16  17
     0:  10  40  40  40
     1:  40  10  40  40
    16:  40  40  10  40
    17:  40  40  40  10

The NUMA nodes are 0,1,16,17

Libvirt uses sequential index as NUMA node numbers and this can
result in crash or incorrect results.
Signed-off-by: NShivaprasad G Bhat <sbhat@linux.vnet.ibm.com>
Signed-off-by: NPradipta Kr. Banerjee <bpradip@in.ibm.com>
上级 037ffda3
......@@ -1000,10 +1000,18 @@ virCapabilitiesGetCpusForNode(virCapsPtr caps,
size_t node,
virBitmapPtr cpumask)
{
virCapsHostNUMACellPtr cell = caps->host.numaCell[node];
virCapsHostNUMACellPtr cell = NULL;
size_t cpu;
size_t index;
/* The numa node numbers can be non-contiguous. Ex: 0,1,16,17. */
for (index = 0; index < caps->host.nnumaCell; index++) {
if (caps->host.numaCell[index]->num == node) {
cell = caps->host.numaCell[index];
break;
}
}
for (cpu = 0; cpu < cell->ncpus; cpu++) {
for (cpu = 0; cell && cpu < cell->ncpus; cpu++) {
if (virBitmapSetBit(cpumask, cell->cpus[cpu].id) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Cpu '%u' in node '%zu' is out of range "
......
......@@ -8566,12 +8566,13 @@ qemuDomainSetNumaParamsLive(virDomainObjPtr vm,
for (i = 0; i < caps->host.nnumaCell; i++) {
bool result;
if (virBitmapGetBit(nodeset, i, &result) < 0) {
virCapsHostNUMACellPtr cell = caps->host.numaCell[i];
if (virBitmapGetBit(nodeset, cell->num, &result) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Failed to get cpuset bit values"));
goto cleanup;
}
if (result && (virBitmapSetBit(temp_nodeset, i) < 0)) {
if (result && (virBitmapSetBit(temp_nodeset, cell->num) < 0)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Failed to set temporary cpuset bit values"));
goto cleanup;
......
......@@ -2002,7 +2002,7 @@ qemuPrepareCpumap(virQEMUDriverPtr driver,
size_t j;
int cur_ncpus = caps->host.numaCell[i]->ncpus;
bool result;
if (virBitmapGetBit(nodemask, i, &result) < 0) {
if (virBitmapGetBit(nodemask, caps->host.numaCell[i]->num, &result) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Failed to convert nodeset to cpuset"));
virBitmapFree(cpumap);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册