@@ -374,9 +374,11 @@ static umf_result_t devdax_allocation_merge(void *provider, void *lowPtr,
374
374
}
375
375
376
376
typedef struct devdax_ipc_data_t {
377
- char dd_path [PATH_MAX ]; // path to the /dev/dax
378
- size_t dd_size ; // size of the /dev/dax
379
- size_t offset ; // offset of the data
377
+ char path [PATH_MAX ]; // path to the /dev/dax
378
+ unsigned protection ; // combination of OS-specific memory protection flags
379
+ // offset of the data (from the beginning of the devdax mapping) - see devdax_get_ipc_handle()
380
+ size_t offset ;
381
+ size_t length ; // length of the data
380
382
} devdax_ipc_data_t ;
381
383
382
384
static umf_result_t devdax_get_ipc_handle_size (void * provider , size_t * size ) {
@@ -391,8 +393,6 @@ static umf_result_t devdax_get_ipc_handle_size(void *provider, size_t *size) {
391
393
392
394
static umf_result_t devdax_get_ipc_handle (void * provider , const void * ptr ,
393
395
size_t size , void * providerIpcData ) {
394
- (void )size ; // unused
395
-
396
396
if (provider == NULL || ptr == NULL || providerIpcData == NULL ) {
397
397
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
398
398
}
@@ -401,11 +401,12 @@ static umf_result_t devdax_get_ipc_handle(void *provider, const void *ptr,
401
401
(devdax_memory_provider_t * )provider ;
402
402
403
403
devdax_ipc_data_t * devdax_ipc_data = (devdax_ipc_data_t * )providerIpcData ;
404
+ strncpy (devdax_ipc_data -> path , devdax_provider -> path , PATH_MAX - 1 );
405
+ devdax_ipc_data -> path [PATH_MAX - 1 ] = '\0' ;
406
+ devdax_ipc_data -> protection = devdax_provider -> protection ;
404
407
devdax_ipc_data -> offset =
405
408
(size_t )((uintptr_t )ptr - (uintptr_t )devdax_provider -> base );
406
- strncpy (devdax_ipc_data -> dd_path , devdax_provider -> path , PATH_MAX - 1 );
407
- devdax_ipc_data -> dd_path [PATH_MAX - 1 ] = '\0' ;
408
- devdax_ipc_data -> dd_size = devdax_provider -> size ;
409
+ devdax_ipc_data -> length = size ;
409
410
410
411
return UMF_RESULT_SUCCESS ;
411
412
}
@@ -421,16 +422,9 @@ static umf_result_t devdax_put_ipc_handle(void *provider,
421
422
devdax_ipc_data_t * devdax_ipc_data = (devdax_ipc_data_t * )providerIpcData ;
422
423
423
424
// verify the path of the /dev/dax
424
- if (strncmp (devdax_ipc_data -> dd_path , devdax_provider -> path , PATH_MAX )) {
425
+ if (strncmp (devdax_ipc_data -> path , devdax_provider -> path , PATH_MAX )) {
425
426
LOG_ERR ("devdax path mismatch (local: %s, ipc: %s)" ,
426
- devdax_provider -> path , devdax_ipc_data -> dd_path );
427
- return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
428
- }
429
-
430
- // verify the size of the /dev/dax
431
- if (devdax_ipc_data -> dd_size != devdax_provider -> size ) {
432
- LOG_ERR ("devdax size mismatch (local: %zu, ipc: %zu)" ,
433
- devdax_provider -> size , devdax_ipc_data -> dd_size );
427
+ devdax_provider -> path , devdax_ipc_data -> path );
434
428
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
435
429
}
436
430
@@ -443,58 +437,54 @@ static umf_result_t devdax_open_ipc_handle(void *provider,
443
437
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
444
438
}
445
439
446
- devdax_memory_provider_t * devdax_provider =
447
- (devdax_memory_provider_t * )provider ;
448
440
devdax_ipc_data_t * devdax_ipc_data = (devdax_ipc_data_t * )providerIpcData ;
449
441
450
- // verify it is the same devdax - first verify the path
451
- if (strncmp (devdax_ipc_data -> dd_path , devdax_provider -> path , PATH_MAX )) {
452
- LOG_ERR ("devdax path mismatch (local: %s, ipc: %s)" ,
453
- devdax_provider -> path , devdax_ipc_data -> dd_path );
454
- return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
455
- }
456
-
457
- // verify the size of the /dev/dax
458
- if (devdax_ipc_data -> dd_size != devdax_provider -> size ) {
459
- LOG_ERR ("devdax size mismatch (local: %zu, ipc: %zu)" ,
460
- devdax_provider -> size , devdax_ipc_data -> dd_size );
461
- return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
462
- }
463
-
464
- umf_result_t ret = UMF_RESULT_SUCCESS ;
465
- int fd = utils_devdax_open (devdax_provider -> path );
442
+ int fd = utils_devdax_open (devdax_ipc_data -> path );
466
443
if (fd == -1 ) {
467
- LOG_PERR ("opening a devdax (%s) failed" , devdax_provider -> path );
444
+ LOG_PERR ("opening the devdax (%s) failed" , devdax_ipc_data -> path );
468
445
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
469
446
}
470
447
471
448
unsigned map_sync_flag = 0 ;
472
449
utils_translate_mem_visibility_flag (UMF_MEM_MAP_SYNC , & map_sync_flag );
473
450
451
+ // It is just a workaround for case when
452
+ // devdax_alloc() was called with the size argument
453
+ // that is not a multiplier of DEVDAX_PAGE_SIZE_2MB.
454
+ size_t offset_aligned = devdax_ipc_data -> offset ;
455
+ size_t length_aligned = devdax_ipc_data -> length ;
456
+ utils_align_ptr_down_size_up ((void * * )& offset_aligned , & length_aligned ,
457
+ DEVDAX_PAGE_SIZE_2MB );
458
+
474
459
// mmap /dev/dax with the MAP_SYNC xor MAP_SHARED flag (if MAP_SYNC fails)
475
- char * base = utils_mmap_file ( NULL , devdax_provider -> size ,
476
- devdax_provider -> protection , map_sync_flag , fd ,
477
- 0 /* offset */ );
478
- if (base == NULL ) {
460
+ char * addr =
461
+ utils_mmap_file ( NULL , length_aligned , devdax_ipc_data -> protection ,
462
+ map_sync_flag , fd , offset_aligned );
463
+ if (addr == NULL ) {
479
464
devdax_store_last_native_error (UMF_DEVDAX_RESULT_ERROR_ALLOC_FAILED ,
480
465
errno );
466
+
481
467
LOG_PERR ("devdax mapping failed (path: %s, size: %zu, protection: %i, "
482
- "fd: %i)" ,
483
- devdax_provider -> path , devdax_provider -> size ,
484
- devdax_provider -> protection , fd );
485
- ret = UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
468
+ "fd: %i, offset: %zu)" ,
469
+ devdax_ipc_data -> path , length_aligned ,
470
+ devdax_ipc_data -> protection , fd , offset_aligned );
471
+
472
+ * ptr = NULL ;
473
+ (void )utils_close_fd (fd );
474
+
475
+ return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
486
476
}
487
477
488
478
LOG_DEBUG ("devdax mapped (path: %s, size: %zu, protection: %i, fd: %i, "
489
- "offset: %zu)" ,
490
- devdax_provider -> path , devdax_provider -> size ,
491
- devdax_provider -> protection , fd , devdax_ipc_data -> offset );
479
+ "offset: %zu) to address %p " ,
480
+ devdax_ipc_data -> path , length_aligned ,
481
+ devdax_ipc_data -> protection , fd , offset_aligned , addr );
492
482
493
- ( void ) utils_close_fd ( fd ) ;
483
+ * ptr = addr ;
494
484
495
- * ptr = base + devdax_ipc_data -> offset ;
485
+ ( void ) utils_close_fd ( fd ) ;
496
486
497
- return ret ;
487
+ return UMF_RESULT_SUCCESS ;
498
488
}
499
489
500
490
static umf_result_t devdax_close_ipc_handle (void * provider , void * ptr ,
@@ -503,16 +493,15 @@ static umf_result_t devdax_close_ipc_handle(void *provider, void *ptr,
503
493
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
504
494
}
505
495
506
- devdax_memory_provider_t * devdax_provider =
507
- (devdax_memory_provider_t * )provider ;
496
+ size = ALIGN_UP (size , DEVDAX_PAGE_SIZE_2MB );
508
497
509
498
errno = 0 ;
510
- int ret = utils_munmap (devdax_provider -> base , devdax_provider -> size );
499
+ int ret = utils_munmap (ptr , size );
511
500
// ignore error when size == 0
512
501
if (ret && (size > 0 )) {
513
502
devdax_store_last_native_error (UMF_DEVDAX_RESULT_ERROR_FREE_FAILED ,
514
503
errno );
515
- LOG_PERR ("memory unmapping failed" );
504
+ LOG_PERR ("memory unmapping failed (ptr: %p, size: %zu)" , ptr , size );
516
505
517
506
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
518
507
}
0 commit comments