Skip to content

Commit 62439bb

Browse files
committed
MMap only part of devdax
Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 1421737 commit 62439bb

File tree

1 file changed

+13
-14
lines changed

1 file changed

+13
-14
lines changed

src/provider/provider_devdax_memory.c

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ typedef struct devdax_ipc_data_t {
373373
size_t size; // size of the /dev/dax
374374
unsigned protection; // combination of OS-specific memory protection flags
375375
size_t offset; // offset of the data
376+
size_t length; // length of the data
376377
} devdax_ipc_data_t;
377378

378379
static umf_result_t devdax_get_ipc_handle_size(void *provider, size_t *size) {
@@ -397,12 +398,13 @@ static umf_result_t devdax_get_ipc_handle(void *provider, const void *ptr,
397398
(devdax_memory_provider_t *)provider;
398399

399400
devdax_ipc_data_t *devdax_ipc_data = (devdax_ipc_data_t *)providerIpcData;
400-
devdax_ipc_data->offset =
401-
(size_t)((uintptr_t)ptr - (uintptr_t)devdax_provider->base);
402401
strncpy(devdax_ipc_data->path, devdax_provider->path, PATH_MAX - 1);
403402
devdax_ipc_data->path[PATH_MAX - 1] = '\0';
404403
devdax_ipc_data->size = devdax_provider->size;
405404
devdax_ipc_data->protection = devdax_provider->protection;
405+
devdax_ipc_data->offset =
406+
(size_t)((uintptr_t)ptr - (uintptr_t)devdax_provider->base);
407+
devdax_ipc_data->length = size;
406408

407409
return UMF_RESULT_SUCCESS;
408410
}
@@ -453,27 +455,27 @@ static umf_result_t devdax_open_ipc_handle(void *provider,
453455
utils_translate_mem_visibility_flag(UMF_MEM_MAP_SYNC, &map_sync_flag);
454456

455457
// mmap /dev/dax with the MAP_SYNC xor MAP_SHARED flag (if MAP_SYNC fails)
456-
char *base = utils_mmap_file(NULL, devdax_ipc_data->size,
458+
char *addr = utils_mmap_file(NULL, devdax_ipc_data->length,
457459
devdax_ipc_data->protection, map_sync_flag, fd,
458-
0 /* offset */);
459-
if (base == NULL) {
460+
devdax_ipc_data->offset);
461+
if (addr == NULL) {
460462
devdax_store_last_native_error(UMF_DEVDAX_RESULT_ERROR_ALLOC_FAILED,
461463
errno);
462464
LOG_PERR("devdax mapping failed (path: %s, size: %zu, protection: %i, "
463-
"fd: %i)",
464-
devdax_ipc_data->path, devdax_ipc_data->size,
465-
devdax_ipc_data->protection, fd);
465+
"fd: %i, offset: %zu)",
466+
devdax_ipc_data->path, devdax_ipc_data->length,
467+
devdax_ipc_data->protection, fd, devdax_ipc_data->offset);
466468
ret = UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
467469
}
468470

469471
LOG_DEBUG("devdax mapped (path: %s, size: %zu, protection: %i, fd: %i, "
470472
"offset: %zu)",
471-
devdax_ipc_data->path, devdax_ipc_data->size,
473+
devdax_ipc_data->path, devdax_ipc_data->length,
472474
devdax_ipc_data->protection, fd, devdax_ipc_data->offset);
473475

474476
(void)utils_close_fd(fd);
475477

476-
*ptr = base + devdax_ipc_data->offset;
478+
*ptr = addr;
477479

478480
return ret;
479481
}
@@ -484,11 +486,8 @@ static umf_result_t devdax_close_ipc_handle(void *provider, void *ptr,
484486
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
485487
}
486488

487-
devdax_memory_provider_t *devdax_provider =
488-
(devdax_memory_provider_t *)provider;
489-
490489
errno = 0;
491-
int ret = utils_munmap(devdax_provider->base, devdax_provider->size);
490+
int ret = utils_munmap(ptr, size);
492491
// ignore error when size == 0
493492
if (ret && (size > 0)) {
494493
devdax_store_last_native_error(UMF_DEVDAX_RESULT_ERROR_FREE_FAILED,

0 commit comments

Comments
 (0)