@@ -58,6 +58,7 @@ umf_result_t umfDevDaxMemoryProviderParamsSetProtection(
58
58
#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC)
59
59
60
60
#include "base_alloc_global.h"
61
+ #include "coarse.h"
61
62
#include "libumf.h"
62
63
#include "utils_common.h"
63
64
#include "utils_concurrency.h"
@@ -74,6 +75,7 @@ typedef struct devdax_memory_provider_t {
74
75
size_t offset ; // offset in the file used for memory mapping
75
76
utils_mutex_t lock ; // lock of ptr and offset
76
77
unsigned protection ; // combination of OS-specific protection flags
78
+ coarse_t * coarse ; // coarse library handle
77
79
} devdax_memory_provider_t ;
78
80
79
81
// DevDax Memory provider settings struct
@@ -133,6 +135,12 @@ devdax_translate_params(umf_devdax_memory_provider_params_t *in_params,
133
135
return UMF_RESULT_SUCCESS ;
134
136
}
135
137
138
+ static umf_result_t devdax_allocation_split_cb (void * provider , void * ptr ,
139
+ size_t totalSize ,
140
+ size_t firstSize );
141
+ static umf_result_t devdax_allocation_merge_cb (void * provider , void * lowPtr ,
142
+ void * highPtr , size_t totalSize );
143
+
136
144
static umf_result_t devdax_initialize (void * params , void * * provider ) {
137
145
umf_result_t ret ;
138
146
@@ -161,21 +169,38 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
161
169
162
170
memset (devdax_provider , 0 , sizeof (* devdax_provider ));
163
171
164
- ret = devdax_translate_params (in_params , devdax_provider );
172
+ coarse_params_t coarse_params = {0 };
173
+ coarse_params .provider = devdax_provider ;
174
+ coarse_params .page_size = DEVDAX_PAGE_SIZE_2MB ;
175
+ coarse_params .cb .alloc = NULL ; // not available for the fixed-size provider
176
+ coarse_params .cb .free = NULL ; // not available for the devdax provider
177
+ coarse_params .cb .split = devdax_allocation_split_cb ;
178
+ coarse_params .cb .merge = devdax_allocation_merge_cb ;
179
+
180
+ coarse_t * coarse = NULL ;
181
+ ret = coarse_new (& coarse_params , & coarse );
165
182
if (ret != UMF_RESULT_SUCCESS ) {
183
+ LOG_ERR ("coarse_new() failed" );
166
184
goto err_free_devdax_provider ;
167
185
}
168
186
187
+ devdax_provider -> coarse = coarse ;
188
+
189
+ ret = devdax_translate_params (in_params , devdax_provider );
190
+ if (ret != UMF_RESULT_SUCCESS ) {
191
+ goto err_coarse_delete ;
192
+ }
193
+
169
194
devdax_provider -> size = in_params -> size ;
170
195
if (utils_copy_path (in_params -> path , devdax_provider -> path , PATH_MAX )) {
171
- goto err_free_devdax_provider ;
196
+ goto err_coarse_delete ;
172
197
}
173
198
174
199
int fd = utils_devdax_open (in_params -> path );
175
200
if (fd == -1 ) {
176
201
LOG_ERR ("cannot open the device DAX: %s" , in_params -> path );
177
202
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT ;
178
- goto err_free_devdax_provider ;
203
+ goto err_coarse_delete ;
179
204
}
180
205
181
206
bool is_dax = false;
@@ -189,23 +214,25 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
189
214
LOG_PDEBUG ("mapping the devdax failed (path=%s, size=%zu)" ,
190
215
in_params -> path , devdax_provider -> size );
191
216
ret = UMF_RESULT_ERROR_UNKNOWN ;
192
- goto err_free_devdax_provider ;
217
+ goto err_coarse_delete ;
193
218
}
194
219
195
220
if (!is_dax ) {
196
221
LOG_ERR ("mapping the devdax with MAP_SYNC failed: %s" , in_params -> path );
197
222
ret = UMF_RESULT_ERROR_UNKNOWN ;
198
-
199
- if (devdax_provider -> base ) {
200
- utils_munmap (devdax_provider -> base , devdax_provider -> size );
201
- }
202
-
203
- goto err_free_devdax_provider ;
223
+ goto err_unmap_devdax ;
204
224
}
205
225
206
226
LOG_DEBUG ("devdax memory mapped (path=%s, size=%zu, addr=%p)" ,
207
227
in_params -> path , devdax_provider -> size , devdax_provider -> base );
208
228
229
+ ret = coarse_add_memory_fixed (coarse , devdax_provider -> base ,
230
+ devdax_provider -> size );
231
+ if (ret != UMF_RESULT_SUCCESS ) {
232
+ LOG_ERR ("adding memory block failed" );
233
+ goto err_unmap_devdax ;
234
+ }
235
+
209
236
if (utils_mutex_init (& devdax_provider -> lock ) == NULL ) {
210
237
LOG_ERR ("lock init failed" );
211
238
ret = UMF_RESULT_ERROR_UNKNOWN ;
@@ -217,7 +244,11 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
217
244
return UMF_RESULT_SUCCESS ;
218
245
219
246
err_unmap_devdax :
220
- utils_munmap (devdax_provider -> base , devdax_provider -> size );
247
+ if (devdax_provider -> base ) {
248
+ utils_munmap (devdax_provider -> base , devdax_provider -> size );
249
+ }
250
+ err_coarse_delete :
251
+ coarse_delete (devdax_provider -> coarse );
221
252
err_free_devdax_provider :
222
253
umf_ba_global_free (devdax_provider );
223
254
return ret ;
@@ -227,78 +258,15 @@ static void devdax_finalize(void *provider) {
227
258
devdax_memory_provider_t * devdax_provider = provider ;
228
259
utils_mutex_destroy_not_free (& devdax_provider -> lock );
229
260
utils_munmap (devdax_provider -> base , devdax_provider -> size );
261
+ coarse_delete (devdax_provider -> coarse );
230
262
umf_ba_global_free (devdax_provider );
231
263
}
232
264
233
- static int devdax_alloc_aligned (size_t length , size_t alignment , void * base ,
234
- size_t size , utils_mutex_t * lock ,
235
- void * * out_addr , size_t * offset ) {
236
- assert (out_addr );
237
-
238
- if (utils_mutex_lock (lock )) {
239
- LOG_ERR ("locking file offset failed" );
240
- return -1 ;
241
- }
242
-
243
- uintptr_t ptr = (uintptr_t )base + * offset ;
244
- uintptr_t rest_of_div = alignment ? (ptr % alignment ) : 0 ;
245
-
246
- if (alignment > 0 && rest_of_div > 0 ) {
247
- ptr += alignment - rest_of_div ;
248
- }
249
-
250
- size_t new_offset = ptr - (uintptr_t )base + length ;
251
-
252
- if (new_offset > size ) {
253
- utils_mutex_unlock (lock );
254
- LOG_ERR ("cannot allocate more memory than the device DAX size: %zu" ,
255
- size );
256
- return -1 ;
257
- }
258
-
259
- * offset = new_offset ;
260
- * out_addr = (void * )ptr ;
261
-
262
- utils_mutex_unlock (lock );
263
-
264
- return 0 ;
265
- }
266
-
267
265
static umf_result_t devdax_alloc (void * provider , size_t size , size_t alignment ,
268
266
void * * resultPtr ) {
269
- int ret ;
270
-
271
- // alignment must be a power of two and a multiple or a divider of the page size
272
- if (alignment && ((alignment & (alignment - 1 )) ||
273
- ((alignment % DEVDAX_PAGE_SIZE_2MB ) &&
274
- (DEVDAX_PAGE_SIZE_2MB % alignment )))) {
275
- LOG_ERR ("wrong alignment: %zu (not a power of 2 or a multiple or a "
276
- "divider of the page size (%zu))" ,
277
- alignment , DEVDAX_PAGE_SIZE_2MB );
278
- return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
279
- }
280
-
281
- if (IS_NOT_ALIGNED (alignment , DEVDAX_PAGE_SIZE_2MB )) {
282
- alignment = ALIGN_UP (alignment , DEVDAX_PAGE_SIZE_2MB );
283
- }
284
-
285
267
devdax_memory_provider_t * devdax_provider =
286
268
(devdax_memory_provider_t * )provider ;
287
-
288
- void * addr = NULL ;
289
- errno = 0 ;
290
- ret = devdax_alloc_aligned (size , alignment , devdax_provider -> base ,
291
- devdax_provider -> size , & devdax_provider -> lock ,
292
- & addr , & devdax_provider -> offset );
293
- if (ret ) {
294
- devdax_store_last_native_error (UMF_DEVDAX_RESULT_ERROR_ALLOC_FAILED , 0 );
295
- LOG_ERR ("memory allocation failed" );
296
- return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
297
- }
298
-
299
- * resultPtr = addr ;
300
-
301
- return UMF_RESULT_SUCCESS ;
269
+ return coarse_alloc (devdax_provider -> coarse , size , alignment , resultPtr );
302
270
}
303
271
304
272
static void devdax_get_last_native_error (void * provider , const char * * ppMessage ,
@@ -384,6 +352,14 @@ static const char *devdax_get_name(void *provider) {
384
352
static umf_result_t devdax_allocation_split (void * provider , void * ptr ,
385
353
size_t totalSize ,
386
354
size_t firstSize ) {
355
+ devdax_memory_provider_t * devdax_provider =
356
+ (devdax_memory_provider_t * )provider ;
357
+ return coarse_split (devdax_provider -> coarse , ptr , totalSize , firstSize );
358
+ }
359
+
360
+ static umf_result_t devdax_allocation_split_cb (void * provider , void * ptr ,
361
+ size_t totalSize ,
362
+ size_t firstSize ) {
387
363
(void )provider ;
388
364
(void )ptr ;
389
365
(void )totalSize ;
@@ -393,6 +369,14 @@ static umf_result_t devdax_allocation_split(void *provider, void *ptr,
393
369
394
370
static umf_result_t devdax_allocation_merge (void * provider , void * lowPtr ,
395
371
void * highPtr , size_t totalSize ) {
372
+ devdax_memory_provider_t * devdax_provider =
373
+ (devdax_memory_provider_t * )provider ;
374
+ return coarse_merge (devdax_provider -> coarse , lowPtr , highPtr , totalSize );
375
+ }
376
+
377
+ static umf_result_t devdax_allocation_merge_cb (void * provider , void * lowPtr ,
378
+ void * highPtr ,
379
+ size_t totalSize ) {
396
380
(void )provider ;
397
381
(void )lowPtr ;
398
382
(void )highPtr ;
0 commit comments