@@ -369,9 +369,10 @@ static umf_result_t devdax_allocation_merge(void *provider, void *lowPtr,
369
369
}
370
370
371
371
typedef struct devdax_ipc_data_t {
372
- char dd_path [PATH_MAX ]; // path to the /dev/dax
373
- size_t dd_size ; // size of the /dev/dax
374
- size_t offset ; // offset of the data
372
+ char path [PATH_MAX ]; // path to the /dev/dax
373
+ unsigned protection ; // combination of OS-specific memory protection flags
374
+ size_t offset ; // offset of the data
375
+ size_t length ; // length of the data
375
376
} devdax_ipc_data_t ;
376
377
377
378
static umf_result_t devdax_get_ipc_handle_size (void * provider , size_t * size ) {
@@ -386,8 +387,6 @@ static umf_result_t devdax_get_ipc_handle_size(void *provider, size_t *size) {
386
387
387
388
static umf_result_t devdax_get_ipc_handle (void * provider , const void * ptr ,
388
389
size_t size , void * providerIpcData ) {
389
- (void )size ; // unused
390
-
391
390
if (provider == NULL || ptr == NULL || providerIpcData == NULL ) {
392
391
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
393
392
}
@@ -396,11 +395,12 @@ static umf_result_t devdax_get_ipc_handle(void *provider, const void *ptr,
396
395
(devdax_memory_provider_t * )provider ;
397
396
398
397
devdax_ipc_data_t * devdax_ipc_data = (devdax_ipc_data_t * )providerIpcData ;
398
+ strncpy (devdax_ipc_data -> path , devdax_provider -> path , PATH_MAX - 1 );
399
+ devdax_ipc_data -> path [PATH_MAX - 1 ] = '\0' ;
400
+ devdax_ipc_data -> protection = devdax_provider -> protection ;
399
401
devdax_ipc_data -> offset =
400
402
(size_t )((uintptr_t )ptr - (uintptr_t )devdax_provider -> base );
401
- strncpy (devdax_ipc_data -> dd_path , devdax_provider -> path , PATH_MAX - 1 );
402
- devdax_ipc_data -> dd_path [PATH_MAX - 1 ] = '\0' ;
403
- devdax_ipc_data -> dd_size = devdax_provider -> size ;
403
+ devdax_ipc_data -> length = size ;
404
404
405
405
return UMF_RESULT_SUCCESS ;
406
406
}
@@ -416,16 +416,9 @@ static umf_result_t devdax_put_ipc_handle(void *provider,
416
416
devdax_ipc_data_t * devdax_ipc_data = (devdax_ipc_data_t * )providerIpcData ;
417
417
418
418
// verify the path of the /dev/dax
419
- if (strncmp (devdax_ipc_data -> dd_path , devdax_provider -> path , PATH_MAX )) {
419
+ if (strncmp (devdax_ipc_data -> path , devdax_provider -> path , PATH_MAX )) {
420
420
LOG_ERR ("devdax path mismatch (local: %s, ipc: %s)" ,
421
- devdax_provider -> path , devdax_ipc_data -> dd_path );
422
- return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
423
- }
424
-
425
- // verify the size of the /dev/dax
426
- if (devdax_ipc_data -> dd_size != devdax_provider -> size ) {
427
- LOG_ERR ("devdax size mismatch (local: %zu, ipc: %zu)" ,
428
- devdax_provider -> size , devdax_ipc_data -> dd_size );
421
+ devdax_provider -> path , devdax_ipc_data -> path );
429
422
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
430
423
}
431
424
@@ -438,58 +431,51 @@ static umf_result_t devdax_open_ipc_handle(void *provider,
438
431
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
439
432
}
440
433
441
- devdax_memory_provider_t * devdax_provider =
442
- (devdax_memory_provider_t * )provider ;
443
434
devdax_ipc_data_t * devdax_ipc_data = (devdax_ipc_data_t * )providerIpcData ;
444
435
445
- // verify it is the same devdax - first verify the path
446
- if (strncmp (devdax_ipc_data -> dd_path , devdax_provider -> path , PATH_MAX )) {
447
- LOG_ERR ("devdax path mismatch (local: %s, ipc: %s)" ,
448
- devdax_provider -> path , devdax_ipc_data -> dd_path );
449
- return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
450
- }
451
-
452
- // verify the size of the /dev/dax
453
- if (devdax_ipc_data -> dd_size != devdax_provider -> size ) {
454
- LOG_ERR ("devdax size mismatch (local: %zu, ipc: %zu)" ,
455
- devdax_provider -> size , devdax_ipc_data -> dd_size );
456
- return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
457
- }
458
-
459
- umf_result_t ret = UMF_RESULT_SUCCESS ;
460
- int fd = utils_devdax_open (devdax_provider -> path );
436
+ int fd = utils_devdax_open (devdax_ipc_data -> path );
461
437
if (fd == -1 ) {
462
- LOG_PERR ("opening a devdax (%s) failed" , devdax_provider -> path );
438
+ LOG_PERR ("opening the devdax (%s) failed" , devdax_ipc_data -> path );
463
439
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
464
440
}
465
441
466
442
unsigned map_sync_flag = 0 ;
467
443
utils_translate_mem_visibility_flag (UMF_MEM_MAP_SYNC , & map_sync_flag );
468
444
445
+ // length and offset passed to mmap() have to be page-aligned
446
+ size_t offset_aligned = devdax_ipc_data -> offset ;
447
+ size_t length_aligned = devdax_ipc_data -> length ;
448
+ utils_align_ptr_down_size_up ((void * * )& offset_aligned , & length_aligned ,
449
+ utils_get_page_size ());
450
+
469
451
// mmap /dev/dax with the MAP_SYNC xor MAP_SHARED flag (if MAP_SYNC fails)
470
- char * base = utils_mmap_file ( NULL , devdax_provider -> size ,
471
- devdax_provider -> protection , map_sync_flag , fd ,
472
- 0 /* offset */ );
473
- if (base == NULL ) {
452
+ char * addr =
453
+ utils_mmap_file ( NULL , length_aligned , devdax_ipc_data -> protection ,
454
+ map_sync_flag , fd , offset_aligned );
455
+ if (addr == NULL ) {
474
456
devdax_store_last_native_error (UMF_DEVDAX_RESULT_ERROR_ALLOC_FAILED ,
475
457
errno );
476
458
LOG_PERR ("devdax mapping failed (path: %s, size: %zu, protection: %i, "
477
- "fd: %i)" ,
478
- devdax_provider -> path , devdax_provider -> size ,
479
- devdax_provider -> protection , fd );
480
- ret = UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
459
+ "fd: %i, offset: %zu)" ,
460
+ devdax_ipc_data -> path , length_aligned ,
461
+ devdax_ipc_data -> protection , fd , offset_aligned );
462
+
463
+ * ptr = NULL ;
464
+ (void )utils_close_fd (fd );
465
+
466
+ return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
481
467
}
482
468
483
469
LOG_DEBUG ("devdax mapped (path: %s, size: %zu, protection: %i, fd: %i, "
484
470
"offset: %zu)" ,
485
- devdax_provider -> path , devdax_provider -> size ,
486
- devdax_provider -> protection , fd , devdax_ipc_data -> offset );
471
+ devdax_ipc_data -> path , length_aligned ,
472
+ devdax_ipc_data -> protection , fd , offset_aligned );
487
473
488
- ( void ) utils_close_fd ( fd );
474
+ * ptr = addr + ( devdax_ipc_data -> offset - offset_aligned );
489
475
490
- * ptr = base + devdax_ipc_data -> offset ;
476
+ ( void ) utils_close_fd ( fd ) ;
491
477
492
- return ret ;
478
+ return UMF_RESULT_SUCCESS ;
493
479
}
494
480
495
481
static umf_result_t devdax_close_ipc_handle (void * provider , void * ptr ,
@@ -498,11 +484,11 @@ static umf_result_t devdax_close_ipc_handle(void *provider, void *ptr,
498
484
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
499
485
}
500
486
501
- devdax_memory_provider_t * devdax_provider =
502
- ( devdax_memory_provider_t * ) provider ;
487
+ // ptr and size passed to munmap() have to be page-aligned
488
+ utils_align_ptr_down_size_up ( & ptr , & size , utils_get_page_size ()) ;
503
489
504
490
errno = 0 ;
505
- int ret = utils_munmap (devdax_provider -> base , devdax_provider -> size );
491
+ int ret = utils_munmap (ptr , size );
506
492
// ignore error when size == 0
507
493
if (ret && (size > 0 )) {
508
494
devdax_store_last_native_error (UMF_DEVDAX_RESULT_ERROR_FREE_FAILED ,
0 commit comments