Skip to content

Commit 4a9e12c

Browse files
kswiecickiigchor
authored andcommitted
Add provider/pool create from memspace functions
1 parent 83af401 commit 4a9e12c

File tree

2 files changed

+79
-11
lines changed

2 files changed

+79
-11
lines changed

src/memory_targets/memory_target_numa.c

Lines changed: 77 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,23 @@
77
*
88
*/
99

10+
#include <assert.h>
1011
#include <stdlib.h>
1112

13+
#include "../memory_pool_internal.h"
1214
#include "memory_target_numa.h"
15+
#include <umf/pools/pool_disjoint.h>
16+
#include <umf/providers/provider_os_memory.h>
1317

1418
struct numa_memory_target_t {
1519
size_t id;
1620
};
1721

1822
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+
1927
struct umf_numa_memory_target_config_t *config =
2028
(struct umf_numa_memory_target_config_t *)params;
2129

@@ -32,32 +40,90 @@ static enum umf_result_t numa_initialize(void *params, void **memTarget) {
3240

3341
static void numa_finalize(void *memTarget) { free(memTarget); }
3442

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;
4579
}
4680

4781
static enum umf_result_t numa_memory_provider_create_from_memspace(
4882
umf_memspace_handle_t memspace, void **memTargets, size_t numTargets,
4983
umf_memspace_policy_handle_t policy,
5084
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) {
51116
// TODO: cast memTargets to (struct numa_memory_target_t**), parse ids and initialize os provider
52117
(void)memspace;
53118
(void)memTargets;
54119
(void)numTargets;
55120
(void)policy;
56-
(void)provider;
121+
(void)pool;
57122
return UMF_RESULT_ERROR_NOT_SUPPORTED;
58123
}
59124

60125
struct umf_memory_target_ops_t UMF_MEMORY_TARGET_NUMA_OPS = {
126+
.version = UMF_VERSION_CURRENT,
61127
.initialize = numa_initialize,
62128
.finalize = numa_finalize,
63129
.pool_create_from_memspace = numa_pool_create_from_memspace,

src/memspace.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ memoryTargetHandlesToPriv(umf_memspace_handle_t memspace, void ***pPrivs) {
5151
}
5252
*pPrivs = privs;
5353

54+
*pPrivs = privs;
55+
5456
return UMF_RESULT_SUCCESS;
5557
}
5658

0 commit comments

Comments
 (0)