Skip to content

Commit 6ba9300

Browse files
committed
Fix maxnode calculation in numa memory target
It should be set to the highest possible id of a node (highest bit set in the map) + 1, and not to number of nodes.
1 parent 8064716 commit 6ba9300

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

src/memory_targets/memory_target_numa.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ static umf_result_t numa_initialize(void *params, void **memTarget) {
4141

4242
static void numa_finalize(void *memTarget) { free(memTarget); }
4343

44+
// sets maxnode and allocates and initializes mask based on provided memory targets
4445
static umf_result_t
4546
numa_targets_create_nodemask(struct numa_memory_target_t **targets,
4647
size_t numTargets, unsigned long **mask,
@@ -61,13 +62,27 @@ numa_targets_create_nodemask(struct numa_memory_target_t **targets,
6162
}
6263
}
6364

65+
int lastBit = hwloc_bitmap_last(bitmap);
66+
if (lastBit == -1) {
67+
// no node is set
68+
hwloc_bitmap_free(bitmap);
69+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
70+
}
71+
72+
*maxnode = lastBit + 1;
73+
6474
int nrUlongs = hwloc_bitmap_nr_ulongs(bitmap);
6575
if (nrUlongs == -1) {
6676
hwloc_bitmap_free(bitmap);
6777
return UMF_RESULT_ERROR_UNKNOWN;
6878
}
6979

7080
unsigned long *nodemask = malloc(sizeof(unsigned long) * nrUlongs);
81+
if (!nodemask) {
82+
hwloc_bitmap_free(bitmap);
83+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
84+
}
85+
7186
int ret = hwloc_bitmap_to_ulongs(bitmap, nrUlongs, nodemask);
7287
hwloc_bitmap_free(bitmap);
7388

@@ -77,7 +92,6 @@ numa_targets_create_nodemask(struct numa_memory_target_t **targets,
7792
}
7893

7994
*mask = nodemask;
80-
*maxnode = nrUlongs * sizeof(unsigned long) * 8;
8195

8296
return UMF_RESULT_SUCCESS;
8397
}

0 commit comments

Comments
 (0)