7
7
*
8
8
*/
9
9
10
+ #include <assert.h>
10
11
#include <stdlib.h>
11
12
13
+ #include "../memory_pool_internal.h"
12
14
#include "memory_target_numa.h"
15
+ #include <umf/pools/pool_disjoint.h>
16
+ #include <umf/providers/provider_os_memory.h>
13
17
14
18
struct numa_memory_target_t {
15
19
size_t id ;
16
20
};
17
21
18
22
static enum umf_result_t numa_initialize (void * params , void * * memTarget ) {
23
+ if (params == NULL || memTarget == NULL ) {
24
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
25
+ }
26
+
19
27
struct umf_numa_memory_target_config_t * config =
20
28
(struct umf_numa_memory_target_config_t * )params ;
21
29
@@ -32,32 +40,90 @@ static enum umf_result_t numa_initialize(void *params, void **memTarget) {
32
40
33
41
static void numa_finalize (void * memTarget ) { free (memTarget ); }
34
42
35
- static enum umf_result_t numa_pool_create_from_memspace (
36
- umf_memspace_handle_t memspace , void * * memTargets , size_t numTargets ,
37
- umf_memspace_policy_handle_t policy , umf_memory_pool_handle_t * pool ) {
38
- // TODO: cast memTargets to (struct numa_memory_target_t**), parse ids and initialize os provider
39
- (void )memspace ;
40
- (void )memTargets ;
41
- (void )numTargets ;
42
- (void )policy ;
43
- (void )pool ;
44
- return UMF_RESULT_ERROR_NOT_SUPPORTED ;
43
+ static const umf_os_memory_provider_params_t
44
+ UMF_OS_MEMORY_PROVIDER_PARAMS_DEFAULT = {
45
+ // Visibility & protection
46
+ .protection = UMF_PROTECTION_READ | UMF_PROTECTION_WRITE ,
47
+ .visibility = UMF_VISIBILITY_PRIVATE ,
48
+
49
+ // NUMA config
50
+ .nodemask = NULL ,
51
+ .maxnode = 0 , // TODO: numa_max_node/GetNumaHighestNodeNumber
52
+ .numa_mode = UMF_NUMA_MODE_DEFAULT ,
53
+ .numa_flags = UMF_NUMA_FLAGS_STRICT , // TODO: determine default behavior
54
+
55
+ // Logging
56
+ .traces = 0 , // TODO: parse env variable for log level?
57
+ };
58
+
59
+ static unsigned long
60
+ numa_targets_get_nodemask (struct numa_memory_target_t * * targets ,
61
+ size_t num_targets ) {
62
+ assert (targets );
63
+ unsigned long nodemask = 0 ;
64
+ for (size_t i = 0 ; i < num_targets ; i ++ ) {
65
+ nodemask |= (1UL << targets [i ]-> id );
66
+ }
67
+
68
+ return nodemask ;
69
+ }
70
+
71
+ static unsigned long numa_nodemask_get_maxnode (unsigned long nodemask ) {
72
+ for (int bitIdx = sizeof (nodemask ) * 8 - 1 ; bitIdx >= 0 ; bitIdx -- ) {
73
+ if ((nodemask & (1UL << bitIdx )) != 0 ) {
74
+ return (unsigned long )bitIdx ;
75
+ }
76
+ }
77
+
78
+ return 0 ;
45
79
}
46
80
47
81
static enum umf_result_t numa_memory_provider_create_from_memspace (
48
82
umf_memspace_handle_t memspace , void * * memTargets , size_t numTargets ,
49
83
umf_memspace_policy_handle_t policy ,
50
84
umf_memory_provider_handle_t * provider ) {
85
+ (void )memspace ;
86
+ // TODO: apply policy
87
+ (void )policy ;
88
+
89
+ struct numa_memory_target_t * * numaTargets =
90
+ (struct numa_memory_target_t * * )memTargets ;
91
+
92
+ // Create node mask from IDs
93
+ unsigned long nodemask = numa_targets_get_nodemask (numaTargets , numTargets );
94
+ unsigned long maxnode = numa_nodemask_get_maxnode (nodemask );
95
+
96
+ umf_os_memory_provider_params_t params =
97
+ UMF_OS_MEMORY_PROVIDER_PARAMS_DEFAULT ;
98
+ params .nodemask = & nodemask ;
99
+ params .maxnode = maxnode ;
100
+
101
+ umf_memory_provider_handle_t numaProvider = NULL ;
102
+ enum umf_result_t ret = umfMemoryProviderCreate (& UMF_OS_MEMORY_PROVIDER_OPS ,
103
+ & params , & numaProvider );
104
+ if (ret ) {
105
+ return ret ;
106
+ }
107
+
108
+ * provider = numaProvider ;
109
+
110
+ return UMF_RESULT_SUCCESS ;
111
+ }
112
+
113
+ static enum umf_result_t numa_pool_create_from_memspace (
114
+ umf_memspace_handle_t memspace , void * * memTargets , size_t numTargets ,
115
+ umf_memspace_policy_handle_t policy , umf_memory_pool_handle_t * pool ) {
51
116
// TODO: cast memTargets to (struct numa_memory_target_t**), parse ids and initialize os provider
52
117
(void )memspace ;
53
118
(void )memTargets ;
54
119
(void )numTargets ;
55
120
(void )policy ;
56
- (void )provider ;
121
+ (void )pool ;
57
122
return UMF_RESULT_ERROR_NOT_SUPPORTED ;
58
123
}
59
124
60
125
struct umf_memory_target_ops_t UMF_MEMORY_TARGET_NUMA_OPS = {
126
+ .version = UMF_VERSION_CURRENT ,
61
127
.initialize = numa_initialize ,
62
128
.finalize = numa_finalize ,
63
129
.pool_create_from_memspace = numa_pool_create_from_memspace ,
0 commit comments