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 "
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;
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);