@@ -58,6 +58,7 @@ umf_result_t umfDevDaxMemoryProviderParamsSetProtection(
5858#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC)
5959
6060#include "base_alloc_global.h"
61+ #include "coarse.h"
6162#include "libumf.h"
6263#include "utils_common.h"
6364#include "utils_concurrency.h"
@@ -74,6 +75,7 @@ typedef struct devdax_memory_provider_t {
7475 size_t offset ; // offset in the file used for memory mapping
7576 utils_mutex_t lock ; // lock of ptr and offset
7677 unsigned protection ; // combination of OS-specific protection flags
78+ coarse_t * coarse ; // coarse library handle
7779} devdax_memory_provider_t ;
7880
7981// DevDax Memory provider settings struct
@@ -133,6 +135,12 @@ devdax_translate_params(umf_devdax_memory_provider_params_t *in_params,
133135 return UMF_RESULT_SUCCESS ;
134136}
135137
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+
136144static umf_result_t devdax_initialize (void * params , void * * provider ) {
137145 umf_result_t ret ;
138146
@@ -161,21 +169,38 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
161169
162170 memset (devdax_provider , 0 , sizeof (* devdax_provider ));
163171
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 );
165182 if (ret != UMF_RESULT_SUCCESS ) {
183+ LOG_ERR ("coarse_new() failed" );
166184 goto err_free_devdax_provider ;
167185 }
168186
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+
169194 devdax_provider -> size = in_params -> size ;
170195 if (utils_copy_path (in_params -> path , devdax_provider -> path , PATH_MAX )) {
171- goto err_free_devdax_provider ;
196+ goto err_coarse_delete ;
172197 }
173198
174199 int fd = utils_devdax_open (in_params -> path );
175200 if (fd == -1 ) {
176201 LOG_ERR ("cannot open the device DAX: %s" , in_params -> path );
177202 ret = UMF_RESULT_ERROR_INVALID_ARGUMENT ;
178- goto err_free_devdax_provider ;
203+ goto err_coarse_delete ;
179204 }
180205
181206 bool is_dax = false;
@@ -189,23 +214,25 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
189214 LOG_PDEBUG ("mapping the devdax failed (path=%s, size=%zu)" ,
190215 in_params -> path , devdax_provider -> size );
191216 ret = UMF_RESULT_ERROR_UNKNOWN ;
192- goto err_free_devdax_provider ;
217+ goto err_coarse_delete ;
193218 }
194219
195220 if (!is_dax ) {
196221 LOG_ERR ("mapping the devdax with MAP_SYNC failed: %s" , in_params -> path );
197222 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 ;
204224 }
205225
206226 LOG_DEBUG ("devdax memory mapped (path=%s, size=%zu, addr=%p)" ,
207227 in_params -> path , devdax_provider -> size , devdax_provider -> base );
208228
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+
209236 if (utils_mutex_init (& devdax_provider -> lock ) == NULL ) {
210237 LOG_ERR ("lock init failed" );
211238 ret = UMF_RESULT_ERROR_UNKNOWN ;
@@ -217,7 +244,11 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
217244 return UMF_RESULT_SUCCESS ;
218245
219246err_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 );
221252err_free_devdax_provider :
222253 umf_ba_global_free (devdax_provider );
223254 return ret ;
@@ -227,78 +258,15 @@ static void devdax_finalize(void *provider) {
227258 devdax_memory_provider_t * devdax_provider = provider ;
228259 utils_mutex_destroy_not_free (& devdax_provider -> lock );
229260 utils_munmap (devdax_provider -> base , devdax_provider -> size );
261+ coarse_delete (devdax_provider -> coarse );
230262 umf_ba_global_free (devdax_provider );
231263}
232264
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-
267265static umf_result_t devdax_alloc (void * provider , size_t size , size_t alignment ,
268266 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-
285267 devdax_memory_provider_t * devdax_provider =
286268 (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 );
302270}
303271
304272static void devdax_get_last_native_error (void * provider , const char * * ppMessage ,
@@ -384,6 +352,14 @@ static const char *devdax_get_name(void *provider) {
384352static umf_result_t devdax_allocation_split (void * provider , void * ptr ,
385353 size_t totalSize ,
386354 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 ) {
387363 (void )provider ;
388364 (void )ptr ;
389365 (void )totalSize ;
@@ -393,6 +369,14 @@ static umf_result_t devdax_allocation_split(void *provider, void *ptr,
393369
394370static umf_result_t devdax_allocation_merge (void * provider , void * lowPtr ,
395371 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 ) {
396380 (void )provider ;
397381 (void )lowPtr ;
398382 (void )highPtr ;
0 commit comments