@@ -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
4749typedef 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+
97105static 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
180207err_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 );
182213err_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-
228226static 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
265233static void devdax_get_last_native_error (void * provider , const char * * ppMessage ,
@@ -345,6 +313,14 @@ static const char *devdax_get_name(void *provider) {
345313static 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
355331static 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 ;
0 commit comments