Skip to content

Commit afc1419

Browse files
committed
Use libcoarse in the devdax provider
Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 3619da7 commit afc1419

File tree

2 files changed

+65
-82
lines changed

2 files changed

+65
-82
lines changed

src/provider/provider_devdax_memory.c

Lines changed: 60 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ umf_memory_provider_ops_t *umfDevDaxMemoryProviderOps(void) {
2727
#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC)
2828

2929
#include "base_alloc_global.h"
30+
#include "coarse.h"
3031
#include "utils_common.h"
3132
#include "utils_concurrency.h"
3233
#include "utils_log.h"
@@ -42,6 +43,7 @@ typedef struct devdax_memory_provider_t {
4243
size_t offset; // offset in the file used for memory mapping
4344
utils_mutex_t lock; // lock of ptr and offset
4445
unsigned protection; // combination of OS-specific protection flags
46+
coarse_t *coarse; // coarse library handle
4547
} devdax_memory_provider_t;
4648

4749
typedef struct devdax_last_native_error_t {
@@ -94,6 +96,12 @@ devdax_translate_params(umf_devdax_memory_provider_params_t *in_params,
9496
return UMF_RESULT_SUCCESS;
9597
}
9698

99+
static umf_result_t devdax_allocation_split_cb(void *provider, void *ptr,
100+
size_t totalSize,
101+
size_t firstSize);
102+
static umf_result_t devdax_allocation_merge_cb(void *provider, void *lowPtr,
103+
void *highPtr, size_t totalSize);
104+
97105
static umf_result_t devdax_initialize(void *params, void **provider) {
98106
umf_result_t ret;
99107

@@ -122,21 +130,38 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
122130

123131
memset(devdax_provider, 0, sizeof(*devdax_provider));
124132

125-
ret = devdax_translate_params(in_params, devdax_provider);
133+
coarse_params_t coarse_params = {0};
134+
coarse_params.provider = devdax_provider;
135+
coarse_params.page_size = DEVDAX_PAGE_SIZE_2MB;
136+
coarse_params.cb.alloc = NULL; // not available for the fixed-size provider
137+
coarse_params.cb.free = NULL; // not available for the devdax provider
138+
coarse_params.cb.split = devdax_allocation_split_cb;
139+
coarse_params.cb.merge = devdax_allocation_merge_cb;
140+
141+
coarse_t *coarse = NULL;
142+
ret = coarse_new(&coarse_params, &coarse);
126143
if (ret != UMF_RESULT_SUCCESS) {
144+
LOG_ERR("coarse_new() failed");
127145
goto err_free_devdax_provider;
128146
}
129147

148+
devdax_provider->coarse = coarse;
149+
150+
ret = devdax_translate_params(in_params, devdax_provider);
151+
if (ret != UMF_RESULT_SUCCESS) {
152+
goto err_coarse_delete;
153+
}
154+
130155
devdax_provider->size = in_params->size;
131156
if (utils_copy_path(in_params->path, devdax_provider->path, PATH_MAX)) {
132-
goto err_free_devdax_provider;
157+
goto err_coarse_delete;
133158
}
134159

135160
int fd = utils_devdax_open(in_params->path);
136161
if (fd == -1) {
137162
LOG_ERR("cannot open the device DAX: %s", in_params->path);
138163
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
139-
goto err_free_devdax_provider;
164+
goto err_coarse_delete;
140165
}
141166

142167
bool is_dax = false;
@@ -150,23 +175,25 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
150175
LOG_PDEBUG("mapping the devdax failed (path=%s, size=%zu)",
151176
in_params->path, devdax_provider->size);
152177
ret = UMF_RESULT_ERROR_UNKNOWN;
153-
goto err_free_devdax_provider;
178+
goto err_coarse_delete;
154179
}
155180

156181
if (!is_dax) {
157182
LOG_ERR("mapping the devdax with MAP_SYNC failed: %s", in_params->path);
158183
ret = UMF_RESULT_ERROR_UNKNOWN;
159-
160-
if (devdax_provider->base) {
161-
utils_munmap(devdax_provider->base, devdax_provider->size);
162-
}
163-
164-
goto err_free_devdax_provider;
184+
goto err_unmap_devdax;
165185
}
166186

167187
LOG_DEBUG("devdax memory mapped (path=%s, size=%zu, addr=%p)",
168188
in_params->path, devdax_provider->size, devdax_provider->base);
169189

190+
ret = coarse_add_memory_fixed(coarse, devdax_provider->base,
191+
devdax_provider->size);
192+
if (ret != UMF_RESULT_SUCCESS) {
193+
LOG_ERR("adding memory block failed");
194+
goto err_unmap_devdax;
195+
}
196+
170197
if (utils_mutex_init(&devdax_provider->lock) == NULL) {
171198
LOG_ERR("lock init failed");
172199
ret = UMF_RESULT_ERROR_UNKNOWN;
@@ -178,7 +205,11 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
178205
return UMF_RESULT_SUCCESS;
179206

180207
err_unmap_devdax:
181-
utils_munmap(devdax_provider->base, devdax_provider->size);
208+
if (devdax_provider->base) {
209+
utils_munmap(devdax_provider->base, devdax_provider->size);
210+
}
211+
err_coarse_delete:
212+
coarse_delete(devdax_provider->coarse);
182213
err_free_devdax_provider:
183214
umf_ba_global_free(devdax_provider);
184215
return ret;
@@ -188,78 +219,15 @@ static void devdax_finalize(void *provider) {
188219
devdax_memory_provider_t *devdax_provider = provider;
189220
utils_mutex_destroy_not_free(&devdax_provider->lock);
190221
utils_munmap(devdax_provider->base, devdax_provider->size);
222+
coarse_delete(devdax_provider->coarse);
191223
umf_ba_global_free(devdax_provider);
192224
}
193225

194-
static int devdax_alloc_aligned(size_t length, size_t alignment, void *base,
195-
size_t size, utils_mutex_t *lock,
196-
void **out_addr, size_t *offset) {
197-
assert(out_addr);
198-
199-
if (utils_mutex_lock(lock)) {
200-
LOG_ERR("locking file offset failed");
201-
return -1;
202-
}
203-
204-
uintptr_t ptr = (uintptr_t)base + *offset;
205-
uintptr_t rest_of_div = alignment ? (ptr % alignment) : 0;
206-
207-
if (alignment > 0 && rest_of_div > 0) {
208-
ptr += alignment - rest_of_div;
209-
}
210-
211-
size_t new_offset = ptr - (uintptr_t)base + length;
212-
213-
if (new_offset > size) {
214-
utils_mutex_unlock(lock);
215-
LOG_ERR("cannot allocate more memory than the device DAX size: %zu",
216-
size);
217-
return -1;
218-
}
219-
220-
*offset = new_offset;
221-
*out_addr = (void *)ptr;
222-
223-
utils_mutex_unlock(lock);
224-
225-
return 0;
226-
}
227-
228226
static umf_result_t devdax_alloc(void *provider, size_t size, size_t alignment,
229227
void **resultPtr) {
230-
int ret;
231-
232-
// alignment must be a power of two and a multiple or a divider of the page size
233-
if (alignment && ((alignment & (alignment - 1)) ||
234-
((alignment % DEVDAX_PAGE_SIZE_2MB) &&
235-
(DEVDAX_PAGE_SIZE_2MB % alignment)))) {
236-
LOG_ERR("wrong alignment: %zu (not a power of 2 or a multiple or a "
237-
"divider of the page size (%zu))",
238-
alignment, DEVDAX_PAGE_SIZE_2MB);
239-
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
240-
}
241-
242-
if (IS_NOT_ALIGNED(alignment, DEVDAX_PAGE_SIZE_2MB)) {
243-
alignment = ALIGN_UP(alignment, DEVDAX_PAGE_SIZE_2MB);
244-
}
245-
246228
devdax_memory_provider_t *devdax_provider =
247229
(devdax_memory_provider_t *)provider;
248-
249-
void *addr = NULL;
250-
errno = 0;
251-
ret = devdax_alloc_aligned(size, alignment, devdax_provider->base,
252-
devdax_provider->size, &devdax_provider->lock,
253-
&addr, &devdax_provider->offset);
254-
if (ret) {
255-
devdax_store_last_native_error(UMF_DEVDAX_RESULT_ERROR_ALLOC_FAILED, 0);
256-
LOG_ERR("memory allocation failed");
257-
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
258-
}
259-
260-
*resultPtr = addr;
261-
262-
return UMF_RESULT_SUCCESS;
230+
return coarse_alloc(devdax_provider->coarse, size, alignment, resultPtr);
263231
}
264232

265233
static void devdax_get_last_native_error(void *provider, const char **ppMessage,
@@ -345,6 +313,14 @@ static const char *devdax_get_name(void *provider) {
345313
static umf_result_t devdax_allocation_split(void *provider, void *ptr,
346314
size_t totalSize,
347315
size_t firstSize) {
316+
devdax_memory_provider_t *devdax_provider =
317+
(devdax_memory_provider_t *)provider;
318+
return coarse_split(devdax_provider->coarse, ptr, totalSize, firstSize);
319+
}
320+
321+
static umf_result_t devdax_allocation_split_cb(void *provider, void *ptr,
322+
size_t totalSize,
323+
size_t firstSize) {
348324
(void)provider;
349325
(void)ptr;
350326
(void)totalSize;
@@ -354,6 +330,14 @@ static umf_result_t devdax_allocation_split(void *provider, void *ptr,
354330

355331
static umf_result_t devdax_allocation_merge(void *provider, void *lowPtr,
356332
void *highPtr, size_t totalSize) {
333+
devdax_memory_provider_t *devdax_provider =
334+
(devdax_memory_provider_t *)provider;
335+
return coarse_merge(devdax_provider->coarse, lowPtr, highPtr, totalSize);
336+
}
337+
338+
static umf_result_t devdax_allocation_merge_cb(void *provider, void *lowPtr,
339+
void *highPtr,
340+
size_t totalSize) {
357341
(void)provider;
358342
(void)lowPtr;
359343
(void)highPtr;

test/provider_devdax_memory.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -217,30 +217,29 @@ TEST_P(umfProviderTest, purge_force) {
217217

218218
TEST_P(umfProviderTest, alloc_page64_align_page_minus_1_WRONG_ALIGNMENT_1) {
219219
test_alloc_failure(provider.get(), page_plus_64, page_size - 1,
220-
UMF_RESULT_ERROR_INVALID_ARGUMENT, 0);
220+
UMF_RESULT_ERROR_INVALID_ALIGNMENT, 0);
221221
}
222222

223223
TEST_P(umfProviderTest, alloc_page64_align_one_half_pages_WRONG_ALIGNMENT_2) {
224224
test_alloc_failure(provider.get(), page_plus_64,
225225
page_size + (page_size / 2),
226-
UMF_RESULT_ERROR_INVALID_ARGUMENT, 0);
226+
UMF_RESULT_ERROR_INVALID_ALIGNMENT, 0);
227227
}
228228

229229
TEST_P(umfProviderTest, alloc_page64_WRONG_ALIGNMENT_3_pages) {
230230
test_alloc_failure(provider.get(), page_plus_64, 3 * page_size,
231-
UMF_RESULT_ERROR_INVALID_ARGUMENT, 0);
231+
UMF_RESULT_ERROR_INVALID_ALIGNMENT, 0);
232232
}
233233

234234
TEST_P(umfProviderTest, alloc_3_pages_WRONG_ALIGNMENT_3_pages) {
235235
test_alloc_failure(provider.get(), 3 * page_size, 3 * page_size,
236-
UMF_RESULT_ERROR_INVALID_ARGUMENT, 0);
236+
UMF_RESULT_ERROR_INVALID_ALIGNMENT, 0);
237237
}
238238

239239
TEST_P(umfProviderTest, alloc_WRONG_SIZE) {
240240
size_t size = (size_t)(-1) & ~(page_size - 1);
241241
test_alloc_failure(provider.get(), size, 0,
242-
UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC,
243-
UMF_DEVDAX_RESULT_ERROR_ALLOC_FAILED);
242+
UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY, 0);
244243
}
245244

246245
// other positive tests

0 commit comments

Comments
 (0)