@@ -41,6 +41,7 @@ static umf_result_t numa_initialize(void *params, void **memTarget) {
41
41
42
42
static void numa_finalize (void * memTarget ) { free (memTarget ); }
43
43
44
+ // sets maxnode and allocates and initializes mask based on provided memory targets
44
45
static umf_result_t
45
46
numa_targets_create_nodemask (struct numa_memory_target_t * * targets ,
46
47
size_t numTargets , unsigned long * * mask ,
@@ -61,13 +62,27 @@ numa_targets_create_nodemask(struct numa_memory_target_t **targets,
61
62
}
62
63
}
63
64
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
+
64
74
int nrUlongs = hwloc_bitmap_nr_ulongs (bitmap );
65
75
if (nrUlongs == -1 ) {
66
76
hwloc_bitmap_free (bitmap );
67
77
return UMF_RESULT_ERROR_UNKNOWN ;
68
78
}
69
79
70
80
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
+
71
86
int ret = hwloc_bitmap_to_ulongs (bitmap , nrUlongs , nodemask );
72
87
hwloc_bitmap_free (bitmap );
73
88
@@ -77,7 +92,6 @@ numa_targets_create_nodemask(struct numa_memory_target_t **targets,
77
92
}
78
93
79
94
* mask = nodemask ;
80
- * maxnode = nrUlongs * sizeof (unsigned long ) * 8 ;
81
95
82
96
return UMF_RESULT_SUCCESS ;
83
97
}
0 commit comments