Skip to content

Commit da4ae27

Browse files
authored
Merge pull request #53 from igchor/memspace_api
Initial memspace and memory_target APIs
2 parents 82eb314 + 9c4e3da commit da4ae27

16 files changed

+762
-1
lines changed

include/umf.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,7 @@
1212

1313
#include <umf/memory_pool.h>
1414
#include <umf/memory_provider.h>
15+
#include <umf/memspace.h>
16+
#include <umf/memspace_policy.h>
1517

1618
#endif /* UMF_UNIFIED_MEMORY_FRAMEWORK_H */

include/umf/memspace.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
*
3+
* Copyright (C) 2023 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
10+
#ifndef UMF_MEMSPACE_H
11+
#define UMF_MEMSPACE_H 1
12+
13+
#include <umf/base.h>
14+
#include <umf/memory_pool.h>
15+
#include <umf/memory_provider.h>
16+
#include <umf/memspace_policy.h>
17+
18+
#ifdef __cplusplus
19+
extern "C" {
20+
#endif
21+
22+
typedef struct umf_memspace_t *umf_memspace_handle_t;
23+
24+
///
25+
/// \brief Creates new memory pool from memspace and policy.
26+
/// \param hMemspace handle to memspace
27+
/// \param hPolicy handle to policy
28+
/// \param hPool [out] handle to the newly created memory pool
29+
/// \return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
30+
///
31+
umf_result_t umfPoolCreateFromMemspace(umf_memspace_handle_t hMemspace,
32+
umf_memspace_policy_handle_t hPolicy,
33+
umf_memory_pool_handle_t *hPool);
34+
35+
///
36+
/// \brief Creates new memory provider from memspace and policy.
37+
/// \param hMemspace handle to memspace
38+
/// \param hPolicy handle to policy
39+
/// \param hProvider [out] handle to the newly created memory provider
40+
/// \return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
41+
///
42+
umf_result_t
43+
umfMemoryProviderCreateFromMemspace(umf_memspace_handle_t hMemspace,
44+
umf_memspace_policy_handle_t hPolicy,
45+
umf_memory_provider_handle_t *hProvider);
46+
47+
#ifdef __cplusplus
48+
}
49+
#endif
50+
51+
#endif /* UMF_MEMSPACE_H */

include/umf/memspace_policy.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
*
3+
* Copyright (C) 2023 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
10+
#ifndef UMF_MEMSPACE_POLICY_H
11+
#define UMF_MEMSPACE_POLICY_H 1
12+
13+
#include <umf/base.h>
14+
15+
#ifdef __cplusplus
16+
extern "C" {
17+
#endif
18+
19+
typedef struct umf_memspace_policy_t *umf_memspace_policy_handle_t;
20+
21+
#ifdef __cplusplus
22+
}
23+
#endif
24+
25+
#endif /* UMF_MEMSPACE_POLICY_H */

src/CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ set(UMF_SOURCES
1212
memory_pool.c
1313
memory_provider.c
1414
memory_provider_get_last_failed.c
15+
memory_target.c
16+
memspace.c
1517
provider/provider_tracking.c
1618
critnib/critnib.c
1719
)
@@ -22,7 +24,10 @@ set(UMF_SOURCES_WINDOWS
2224

2325
if(UMF_BUILD_OS_MEMORY_PROVIDER)
2426
set(UMF_SOURCES ${UMF_SOURCES} provider/provider_os_memory.c)
25-
set(UMF_SOURCES_LINUX ${UMF_SOURCES_LINUX} provider/provider_os_memory_linux.c)
27+
set(UMF_SOURCES_LINUX ${UMF_SOURCES_LINUX}
28+
provider/provider_os_memory_linux.c
29+
memory_targets/memory_target_numa.c
30+
memspaces/memspace_numa.c)
2631
set(UMF_SOURCES_WINDOWS ${UMF_SOURCES_WINDOWS} provider/provider_os_memory_windows.c)
2732
if(LINUX)
2833
set(UMF_LIBS ${UMF_LIBS} numa)

src/memory_target.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
*
3+
* Copyright (C) 2023 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
10+
#include <assert.h>
11+
#include <stdlib.h>
12+
13+
#include "memory_target.h"
14+
#include "memory_target_ops.h"
15+
16+
umf_result_t umfMemoryTargetCreate(const umf_memory_target_ops_t *ops,
17+
void *params,
18+
umf_memory_target_handle_t *memoryTarget) {
19+
if (!ops || !memoryTarget) {
20+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
21+
}
22+
23+
umf_memory_target_handle_t target =
24+
(umf_memory_target_t *)malloc(sizeof(umf_memory_target_t));
25+
if (!target) {
26+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
27+
}
28+
29+
assert(ops->version == UMF_VERSION_CURRENT);
30+
31+
target->ops = ops;
32+
33+
void *target_priv;
34+
umf_result_t ret = ops->initialize(params, &target_priv);
35+
if (ret != UMF_RESULT_SUCCESS) {
36+
free(target);
37+
return ret;
38+
}
39+
40+
target->priv = target_priv;
41+
42+
*memoryTarget = target;
43+
44+
return UMF_RESULT_SUCCESS;
45+
}
46+
47+
void umfMemoryTargetDestroy(umf_memory_target_handle_t memoryTarget) {
48+
assert(memoryTarget);
49+
memoryTarget->ops->finalize(memoryTarget->priv);
50+
free(memoryTarget);
51+
}

src/memory_target.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
*
3+
* Copyright (C) 2023 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
10+
#ifndef UMF_MEMORY_TARGET_H
11+
#define UMF_MEMORY_TARGET_H 1
12+
13+
#include <umf/base.h>
14+
15+
#ifdef __cplusplus
16+
extern "C" {
17+
#endif
18+
19+
struct umf_memory_target_ops_t;
20+
typedef struct umf_memory_target_ops_t umf_memory_target_ops_t;
21+
22+
typedef struct umf_memory_target_t {
23+
const umf_memory_target_ops_t *ops;
24+
void *priv;
25+
} umf_memory_target_t;
26+
27+
typedef umf_memory_target_t *umf_memory_target_handle_t;
28+
29+
umf_result_t umfMemoryTargetCreate(const umf_memory_target_ops_t *ops,
30+
void *params,
31+
umf_memory_target_handle_t *memoryTarget);
32+
33+
void umfMemoryTargetDestroy(umf_memory_target_handle_t memoryTarget);
34+
35+
#ifdef __cplusplus
36+
}
37+
#endif
38+
39+
#endif /* UMF_MEMORY_TARGET_H */

src/memory_target_ops.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
*
3+
* Copyright (C) 2023 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
10+
#ifndef UMF_MEMORY_TARGET_OPS_H
11+
#define UMF_MEMORY_TARGET_OPS_H 1
12+
13+
#include <stdbool.h>
14+
15+
#include <umf/base.h>
16+
#include <umf/memspace.h>
17+
18+
#ifdef __cplusplus
19+
extern "C" {
20+
#endif
21+
22+
typedef struct umf_memory_target_t *umf_memory_target_handle_t;
23+
24+
typedef struct umf_memory_target_ops_t {
25+
/// Version of the ops structure.
26+
/// Should be initialized using UMF_VERSION_CURRENT
27+
uint32_t version;
28+
29+
umf_result_t (*initialize)(void *params, void **memoryTarget);
30+
void (*finalize)(void *memoryTarget);
31+
32+
umf_result_t (*pool_create_from_memspace)(
33+
umf_memspace_handle_t memspace, void **memoryTargets, size_t numTargets,
34+
umf_memspace_policy_handle_t policy, umf_memory_pool_handle_t *pool);
35+
36+
umf_result_t (*memory_provider_create_from_memspace)(
37+
umf_memspace_handle_t memspace, void **memoryTargets, size_t numTargets,
38+
umf_memspace_policy_handle_t policy,
39+
umf_memory_provider_handle_t *provider);
40+
} umf_memory_target_ops_t;
41+
42+
#ifdef __cplusplus
43+
}
44+
#endif
45+
46+
#endif /* #ifndef UMF_MEMORY_TARGET_OPS_H */
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
/*
2+
*
3+
* Copyright (C) 2023 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
10+
#include <assert.h>
11+
#include <numa.h>
12+
#include <stdlib.h>
13+
14+
#include "../memory_pool_internal.h"
15+
#include "memory_target_numa.h"
16+
#include <umf/pools/pool_disjoint.h>
17+
#include <umf/providers/provider_os_memory.h>
18+
19+
struct numa_memory_target_t {
20+
size_t id;
21+
};
22+
23+
static umf_result_t numa_initialize(void *params, void **memTarget) {
24+
if (params == NULL || memTarget == NULL) {
25+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
26+
}
27+
28+
struct umf_numa_memory_target_config_t *config =
29+
(struct umf_numa_memory_target_config_t *)params;
30+
31+
struct numa_memory_target_t *numaTarget =
32+
malloc(sizeof(struct numa_memory_target_t));
33+
if (!numaTarget) {
34+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
35+
}
36+
37+
numaTarget->id = config->id;
38+
*memTarget = numaTarget;
39+
return UMF_RESULT_SUCCESS;
40+
}
41+
42+
static void numa_finalize(void *memTarget) { free(memTarget); }
43+
44+
static const umf_os_memory_provider_params_t
45+
UMF_OS_MEMORY_PROVIDER_PARAMS_DEFAULT = {
46+
// Visibility & protection
47+
.protection = UMF_PROTECTION_READ | UMF_PROTECTION_WRITE,
48+
.visibility = UMF_VISIBILITY_PRIVATE,
49+
50+
// NUMA config
51+
.nodemask = NULL,
52+
.maxnode = 0, // TODO: numa_max_node/GetNumaHighestNodeNumber
53+
.numa_mode = UMF_NUMA_MODE_DEFAULT,
54+
.numa_flags = UMF_NUMA_FLAGS_STRICT, // TODO: determine default behavior
55+
56+
// Logging
57+
.traces = 0, // TODO: parse env variable for log level?
58+
};
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 *
70+
numa_targets_create_nodemask(struct numa_memory_target_t **targets,
71+
size_t numTargets) {
72+
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;
77+
}
78+
79+
for (size_t i = 0; i < numTargets; i++) {
80+
numa_bitmask_setbit(mask, targets[i]->id);
81+
}
82+
83+
return mask;
84+
}
85+
86+
static enum umf_result_t numa_memory_provider_create_from_memspace(
87+
umf_memspace_handle_t memspace, void **memTargets, size_t numTargets,
88+
umf_memspace_policy_handle_t policy,
89+
umf_memory_provider_handle_t *provider) {
90+
(void)memspace;
91+
// TODO: apply policy
92+
(void)policy;
93+
94+
struct numa_memory_target_t **numaTargets =
95+
(struct numa_memory_target_t **)memTargets;
96+
97+
// Create node mask from IDs
98+
struct bitmask *nodemask =
99+
numa_targets_create_nodemask(numaTargets, numTargets);
100+
101+
umf_os_memory_provider_params_t params =
102+
UMF_OS_MEMORY_PROVIDER_PARAMS_DEFAULT;
103+
params.nodemask = nodemask->maskp;
104+
params.maxnode = nodemask->size;
105+
106+
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);
110+
if (ret) {
111+
return ret;
112+
}
113+
114+
*provider = numaProvider;
115+
116+
return UMF_RESULT_SUCCESS;
117+
}
118+
119+
static umf_result_t numa_pool_create_from_memspace(
120+
umf_memspace_handle_t memspace, void **memTargets, size_t numTargets,
121+
umf_memspace_policy_handle_t policy, umf_memory_pool_handle_t *pool) {
122+
(void)memspace;
123+
(void)memTargets;
124+
(void)numTargets;
125+
(void)policy;
126+
(void)pool;
127+
return UMF_RESULT_ERROR_NOT_SUPPORTED;
128+
}
129+
130+
struct umf_memory_target_ops_t UMF_MEMORY_TARGET_NUMA_OPS = {
131+
.version = UMF_VERSION_CURRENT,
132+
.initialize = numa_initialize,
133+
.finalize = numa_finalize,
134+
.pool_create_from_memspace = numa_pool_create_from_memspace,
135+
.memory_provider_create_from_memspace =
136+
numa_memory_provider_create_from_memspace};

0 commit comments

Comments
 (0)