Skip to content

Commit 1097362

Browse files
authored
Merge pull request #244 from ldorau/Replace_linear_base_allocator_with_the_global_one
Replace linear base allocator with the global one
2 parents 6cd2abc + 39a9922 commit 1097362

File tree

9 files changed

+36
-77
lines changed

9 files changed

+36
-77
lines changed

src/base_alloc/base_alloc_global.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,11 @@ void *umf_ba_global_alloc(size_t size) {
8686
util_init_once(&ba_is_initialized, umf_ba_create_global);
8787

8888
if (size > BASE_ALLOC.ac_sizes[NUM_ALLOCATION_CLASSES - 1]) {
89+
#ifndef NDEBUG
8990
fprintf(stderr,
9091
"base_alloc: allocation size larger than the biggest "
9192
"allocation class. Falling back to OS memory allocation.\n");
93+
#endif
9294
return ba_os_alloc(size);
9395
}
9496

src/critnib/critnib.c

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
#include <stddef.h>
5959

6060
#include "base_alloc.h"
61-
#include "base_alloc_linear.h"
61+
#include "base_alloc_global.h"
6262
#include "critnib.h"
6363
#include "utils_common.h"
6464
#include "utils_concurrency.h"
@@ -130,7 +130,6 @@ struct critnib {
130130

131131
struct os_mutex_t mutex; /* writes/removes */
132132

133-
umf_ba_linear_pool_t *pool_linear;
134133
umf_ba_pool_t *pool_nodes;
135134
umf_ba_pool_t *pool_leaves;
136135
};
@@ -182,23 +181,14 @@ static inline unsigned slice_index(word key, sh_t shift) {
182181
* critnib_new -- allocates a new critnib structure
183182
*/
184183
struct critnib *critnib_new(void) {
185-
umf_ba_linear_pool_t *pool_linear =
186-
umf_ba_linear_create(0 /* minimal pool size */);
187-
if (!pool_linear) {
188-
return NULL;
189-
}
190-
191-
struct critnib *c =
192-
umf_ba_linear_alloc(pool_linear, sizeof(struct critnib));
184+
struct critnib *c = umf_ba_global_alloc(sizeof(struct critnib));
193185
if (!c) {
194-
goto err_destroy_pool_linear;
186+
return NULL;
195187
}
196188

197-
c->pool_linear = pool_linear;
198-
199189
void *mutex_ptr = util_mutex_init(&c->mutex);
200190
if (!mutex_ptr) {
201-
goto err_destroy_pool_linear;
191+
goto err_free_critnib;
202192
}
203193

204194
c->pool_nodes = umf_ba_create(sizeof(struct critnib_node));
@@ -220,8 +210,8 @@ struct critnib *critnib_new(void) {
220210
umf_ba_destroy(c->pool_nodes);
221211
err_util_mutex_destroy:
222212
util_mutex_destroy_not_free(&c->mutex);
223-
err_destroy_pool_linear:
224-
umf_ba_linear_destroy(pool_linear); // free all its allocations and destroy
213+
err_free_critnib:
214+
umf_ba_global_free(c, sizeof(struct critnib));
225215
return NULL;
226216
}
227217

@@ -250,7 +240,6 @@ void critnib_delete(struct critnib *c) {
250240
delete_node(c, c->root);
251241
}
252242

253-
// mutex is freed in umf_ba_linear_destroy(c->pool_linear) at the end
254243
util_mutex_destroy_not_free(&c->mutex);
255244

256245
for (struct critnib_node *m = c->deleted_node; m;) {
@@ -272,10 +261,7 @@ void critnib_delete(struct critnib *c) {
272261

273262
umf_ba_destroy(c->pool_nodes);
274263
umf_ba_destroy(c->pool_leaves);
275-
umf_ba_linear_destroy(
276-
c->pool_linear); // free all its allocations and destroy
277-
278-
// 'c' was freed in umf_ba_linear_destroy(c->pool_linear)
264+
umf_ba_global_free(c, sizeof(struct critnib));
279265
}
280266

281267
/*

src/memory_targets/memory_target_numa.c

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
#include "../memory_pool_internal.h"
1818
#include "base_alloc.h"
1919
#include "base_alloc_global.h"
20-
#include "base_alloc_linear.h"
2120
#include "memory_target_numa.h"
2221

2322
struct numa_memory_target_t {
@@ -51,8 +50,7 @@ static void numa_finalize(void *memTarget) {
5150
static umf_result_t
5251
numa_targets_create_nodemask(struct numa_memory_target_t **targets,
5352
size_t numTargets, unsigned long **mask,
54-
unsigned *maxnode,
55-
umf_ba_linear_pool_t *linear_allocator) {
53+
unsigned *maxnode, size_t *mask_size) {
5654
assert(targets);
5755
assert(mask);
5856
assert(maxnode);
@@ -83,8 +81,9 @@ numa_targets_create_nodemask(struct numa_memory_target_t **targets,
8381
unsigned bits_per_long = sizeof(unsigned long) * 8;
8482
int nrUlongs = (lastBit + bits_per_long) / bits_per_long;
8583

86-
unsigned long *nodemask = umf_ba_linear_alloc(
87-
linear_allocator, (sizeof(unsigned long) * nrUlongs));
84+
*mask_size = sizeof(unsigned long) * nrUlongs;
85+
86+
unsigned long *nodemask = umf_ba_global_alloc(*mask_size);
8887
if (!nodemask) {
8988
hwloc_bitmap_free(bitmap);
9089
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
@@ -94,7 +93,7 @@ numa_targets_create_nodemask(struct numa_memory_target_t **targets,
9493
hwloc_bitmap_free(bitmap);
9594

9695
if (ret) {
97-
// nodemask is freed during destroying linear_allocator
96+
umf_ba_global_free(nodemask, *mask_size);
9897
return UMF_RESULT_ERROR_UNKNOWN;
9998
}
10099

@@ -116,15 +115,10 @@ static enum umf_result_t numa_memory_provider_create_from_memspace(
116115

117116
unsigned long *nodemask;
118117
unsigned maxnode;
119-
120-
umf_ba_linear_pool_t *linear_allocator =
121-
umf_ba_linear_create(0 /* minimal pool size */);
122-
if (!linear_allocator) {
123-
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
124-
}
118+
size_t nodemask_size;
125119

126120
umf_result_t ret = numa_targets_create_nodemask(
127-
numaTargets, numTargets, &nodemask, &maxnode, linear_allocator);
121+
numaTargets, numTargets, &nodemask, &maxnode, &nodemask_size);
128122
if (ret != UMF_RESULT_SUCCESS) {
129123
return ret;
130124
}
@@ -137,9 +131,8 @@ static enum umf_result_t numa_memory_provider_create_from_memspace(
137131
umf_memory_provider_handle_t numaProvider = NULL;
138132
ret = umfMemoryProviderCreate(umfOsMemoryProviderOps(), &params,
139133
&numaProvider);
140-
umf_ba_linear_destroy(linear_allocator); // nodemask is freed here
134+
umf_ba_global_free(nodemask, nodemask_size);
141135
if (ret) {
142-
143136
return ret;
144137
}
145138

src/memory_targets/memory_target_numa.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
#include "../memory_target.h"
1717
#include "../memory_target_ops.h"
18-
#include "base_alloc_linear.h"
1918

2019
#ifdef __cplusplus
2120
extern "C" {

src/memspace.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ static umf_result_t verifyMemTargetsTypes(umf_memspace_handle_t memspace) {
3838
static umf_result_t memoryTargetHandlesToPriv(umf_memspace_handle_t memspace,
3939
void ***pPrivs) {
4040
assert(memspace);
41-
void **privs = umf_ba_linear_alloc(memspace->linear_allocator,
42-
sizeof(void *) * memspace->size);
41+
void **privs = umf_ba_global_alloc(sizeof(void *) * memspace->size);
4342
if (privs == NULL) {
4443
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
4544
}
@@ -70,7 +69,8 @@ umf_result_t umfPoolCreateFromMemspace(umf_memspace_handle_t memspace,
7069
assert(verifyMemTargetsTypes(memspace) == UMF_RESULT_SUCCESS);
7170
ret = memspace->nodes[0]->ops->pool_create_from_memspace(
7271
memspace, privs, memspace->size, policy, pool);
73-
// privs is freed during destroying memspace->linear_allocator
72+
73+
umf_ba_global_free(privs, sizeof(void *) * memspace->size);
7474

7575
return ret;
7676
}
@@ -94,7 +94,8 @@ umfMemoryProviderCreateFromMemspace(umf_memspace_handle_t memspace,
9494
assert(verifyMemTargetsTypes(memspace) == UMF_RESULT_SUCCESS);
9595
ret = memspace->nodes[0]->ops->memory_provider_create_from_memspace(
9696
memspace, privs, memspace->size, policy, provider);
97-
// privs is freed during destroying memspace->linear_allocator
97+
98+
umf_ba_global_free(privs, sizeof(void *) * memspace->size);
9899

99100
return ret;
100101
}
@@ -105,6 +106,7 @@ void umfMemspaceDestroy(umf_memspace_handle_t memspace) {
105106
umfMemoryTargetDestroy(memspace->nodes[i]);
106107
}
107108

108-
umf_ba_linear_destroy(memspace->linear_allocator);
109+
umf_ba_global_free(memspace->nodes,
110+
memspace->size * sizeof(umf_memory_target_handle_t));
109111
umf_ba_global_free(memspace, sizeof(struct umf_memspace_t));
110112
}

src/memspace_internal.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
#include <umf/memspace.h>
1414

1515
#include "base_alloc.h"
16-
#include "base_alloc_linear.h"
1716
#include "memory_target.h"
1817

1918
#ifdef __cplusplus
@@ -23,9 +22,6 @@ extern "C" {
2322
struct umf_memspace_t {
2423
size_t size;
2524
umf_memory_target_handle_t *nodes;
26-
27-
// own local linear base allocator
28-
umf_ba_linear_pool_t *linear_allocator;
2925
};
3026

3127
///

src/memspaces/memspace_numa.c

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
#include "../memory_targets/memory_target_numa.h"
1313
#include "../memspace_internal.h"
1414
#include "base_alloc_global.h"
15-
#include "base_alloc_linear.h"
1615
#include "memspace_numa.h"
1716

1817
enum umf_result_t
@@ -30,18 +29,9 @@ umfMemspaceCreateFromNumaArray(size_t *nodeIds, size_t numIds,
3029
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
3130
}
3231

33-
umf_ba_linear_pool_t *linear_allocator =
34-
umf_ba_linear_create(0 /* minimal pool size */);
35-
if (!linear_allocator) {
36-
ret = UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
37-
goto err_umf_ba_linear_create;
38-
}
39-
40-
memspace->linear_allocator = linear_allocator;
41-
4232
memspace->size = numIds;
43-
memspace->nodes = (umf_memory_target_handle_t *)umf_ba_linear_alloc(
44-
linear_allocator, numIds * sizeof(umf_memory_target_handle_t));
33+
memspace->nodes = (umf_memory_target_handle_t *)umf_ba_global_alloc(
34+
memspace->size * sizeof(umf_memory_target_handle_t));
4535
if (!memspace->nodes) {
4636
ret = UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
4737
goto err_nodes_alloc;
@@ -62,12 +52,12 @@ umfMemspaceCreateFromNumaArray(size_t *nodeIds, size_t numIds,
6252
return UMF_RESULT_SUCCESS;
6353

6454
err_target_create:
55+
umf_ba_global_free(memspace->nodes,
56+
memspace->size * sizeof(umf_memory_target_handle_t));
6557
for (size_t i = 0; i < nodeIdx; i++) {
6658
umfMemoryTargetDestroy(memspace->nodes[i]);
6759
}
6860
err_nodes_alloc:
69-
umf_ba_linear_destroy(linear_allocator);
70-
err_umf_ba_linear_create:
7161
umf_ba_global_free(memspace, sizeof(struct umf_memspace_t));
7262
return ret;
7363
}

src/provider/provider_tracking.c

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -464,26 +464,19 @@ void umfTrackingMemoryProviderGetUpstreamProvider(
464464
}
465465

466466
umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
467-
umf_ba_linear_pool_t *pool_linear =
468-
umf_ba_linear_create(0 /* minimum pool size */);
469-
if (!pool_linear) {
467+
umf_memory_tracker_handle_t handle =
468+
(umf_memory_tracker_handle_t)umf_ba_global_alloc(
469+
sizeof(struct umf_memory_tracker_t));
470+
if (!handle) {
470471
return NULL;
471472
}
472473

473474
umf_ba_pool_t *tracker_allocator =
474475
umf_ba_create(sizeof(struct tracker_value_t));
475476
if (!tracker_allocator) {
476-
goto err_destroy_pool_linear;
477-
}
478-
479-
umf_memory_tracker_handle_t handle =
480-
(umf_memory_tracker_handle_t)umf_ba_linear_alloc(
481-
pool_linear, sizeof(struct umf_memory_tracker_t));
482-
if (!handle) {
483-
goto err_destroy_tracker_allocator;
477+
goto err_free_handle;
484478
}
485479

486-
handle->pool_linear = pool_linear;
487480
handle->tracker_allocator = tracker_allocator;
488481

489482
void *mutex_ptr = util_mutex_init(&handle->splitMergeMutex);
@@ -502,8 +495,8 @@ umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
502495
util_mutex_destroy_not_free(&handle->splitMergeMutex);
503496
err_destroy_tracker_allocator:
504497
umf_ba_destroy(tracker_allocator);
505-
err_destroy_pool_linear:
506-
umf_ba_linear_destroy(pool_linear);
498+
err_free_handle:
499+
umf_ba_global_free(handle, sizeof(struct umf_memory_tracker_t));
507500
return NULL;
508501
}
509502

@@ -519,5 +512,5 @@ void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
519512
critnib_delete(handle->map);
520513
util_mutex_destroy_not_free(&handle->splitMergeMutex);
521514
umf_ba_destroy(handle->tracker_allocator);
522-
umf_ba_linear_destroy(handle->pool_linear);
515+
umf_ba_global_free(handle, sizeof(struct umf_memory_tracker_t));
523516
}

src/provider/provider_tracking.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#include <umf/memory_provider.h>
1919

2020
#include "base_alloc.h"
21-
#include "base_alloc_linear.h"
2221
#include "critnib.h"
2322
#include "utils_concurrency.h"
2423

@@ -27,7 +26,6 @@ extern "C" {
2726
#endif
2827

2928
struct umf_memory_tracker_t {
30-
umf_ba_linear_pool_t *pool_linear;
3129
umf_ba_pool_t *tracker_allocator;
3230
critnib *map;
3331
os_mutex_t splitMergeMutex;

0 commit comments

Comments
 (0)