8
8
*/
9
9
10
10
#include <assert.h>
11
- #include <numa .h>
11
+ #include <hwloc .h>
12
12
#include <stdlib.h>
13
13
14
14
#include "../memory_pool_internal.h"
@@ -50,37 +50,52 @@ static const umf_os_memory_provider_params_t
50
50
// NUMA config
51
51
.nodemask = NULL ,
52
52
.maxnode = 0 , // TODO: numa_max_node/GetNumaHighestNodeNumber
53
- .numa_mode = UMF_NUMA_MODE_DEFAULT ,
53
+ .numa_mode = UMF_NUMA_MODE_BIND ,
54
54
.numa_flags = UMF_NUMA_FLAGS_STRICT , // TODO: determine default behavior
55
55
56
56
// Logging
57
57
.traces = 0 , // TODO: parse env variable for log level?
58
58
};
59
59
60
- static size_t numa_targets_get_maxnode (struct numa_memory_target_t * * targets ,
61
- size_t numTargets ) {
62
- size_t maxNode = 0 ;
63
- for (size_t i = 0 ; i < numTargets ; i ++ ) {
64
- maxNode = maxNode > targets [i ]-> id ? maxNode : targets [i ]-> id ;
65
- }
66
- return maxNode ;
67
- }
68
-
69
- static struct bitmask *
60
+ static umf_result_t
70
61
numa_targets_create_nodemask (struct numa_memory_target_t * * targets ,
71
- size_t numTargets ) {
62
+ size_t numTargets , unsigned long * * mask ,
63
+ unsigned * maxnode ) {
72
64
assert (targets );
73
- size_t maxNode = numa_targets_get_maxnode (targets , numTargets );
74
- struct bitmask * mask = numa_bitmask_alloc (maxNode + 1 );
75
- if (!mask ) {
76
- return NULL ;
65
+ assert (mask );
66
+ assert (maxnode );
67
+
68
+ hwloc_bitmap_t bitmap = hwloc_bitmap_alloc ();
69
+ if (!bitmap ) {
70
+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
77
71
}
78
72
79
73
for (size_t i = 0 ; i < numTargets ; i ++ ) {
80
- numa_bitmask_setbit (mask , targets [i ]-> id );
74
+ if (hwloc_bitmap_set (bitmap , targets [i ]-> id )) {
75
+ hwloc_bitmap_free (bitmap );
76
+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
77
+ }
78
+ }
79
+
80
+ int nrUlongs = hwloc_bitmap_nr_ulongs (bitmap );
81
+ if (nrUlongs == -1 ) {
82
+ hwloc_bitmap_free (bitmap );
83
+ return UMF_RESULT_ERROR_UNKNOWN ;
81
84
}
82
85
83
- return mask ;
86
+ unsigned long * nodemask = malloc (sizeof (unsigned long ) * nrUlongs );
87
+ int ret = hwloc_bitmap_to_ulongs (bitmap , nrUlongs , nodemask );
88
+ hwloc_bitmap_free (bitmap );
89
+
90
+ if (ret ) {
91
+ free (nodemask );
92
+ return UMF_RESULT_ERROR_UNKNOWN ;
93
+ }
94
+
95
+ * mask = nodemask ;
96
+ * maxnode = nrUlongs * sizeof (unsigned long ) * 8 ;
97
+
98
+ return UMF_RESULT_SUCCESS ;
84
99
}
85
100
86
101
static enum umf_result_t numa_memory_provider_create_from_memspace (
@@ -94,19 +109,24 @@ static enum umf_result_t numa_memory_provider_create_from_memspace(
94
109
struct numa_memory_target_t * * numaTargets =
95
110
(struct numa_memory_target_t * * )memTargets ;
96
111
97
- // Create node mask from IDs
98
- struct bitmask * nodemask =
99
- numa_targets_create_nodemask (numaTargets , numTargets );
112
+ unsigned long * nodemask ;
113
+ unsigned maxnode ;
114
+
115
+ umf_result_t ret = numa_targets_create_nodemask (numaTargets , numTargets ,
116
+ & nodemask , & maxnode );
117
+ if (ret != UMF_RESULT_SUCCESS ) {
118
+ return ret ;
119
+ }
100
120
101
121
umf_os_memory_provider_params_t params =
102
122
UMF_OS_MEMORY_PROVIDER_PARAMS_DEFAULT ;
103
- params .nodemask = nodemask -> maskp ;
104
- params .maxnode = nodemask -> size ;
123
+ params .nodemask = nodemask ;
124
+ params .maxnode = maxnode ;
105
125
106
126
umf_memory_provider_handle_t numaProvider = NULL ;
107
- enum umf_result_t ret = umfMemoryProviderCreate (& UMF_OS_MEMORY_PROVIDER_OPS ,
108
- & params , & numaProvider );
109
- numa_bitmask_free (nodemask );
127
+ ret = umfMemoryProviderCreate (& UMF_OS_MEMORY_PROVIDER_OPS , & params ,
128
+ & numaProvider );
129
+ free (nodemask );
110
130
if (ret ) {
111
131
return ret ;
112
132
}
0 commit comments