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