Skip to content

Commit 61e001e

Browse files
committed
Rename utils_devdax_mmap to utils_mmap_file and improve it
Rename utils_devdax_mmap to utils_mmap_file and improve it: - add support for MAP_PRIVATE - add flags and fd_offset arguments Signed-off-by: Lukasz Dorau <[email protected]>
1 parent cea17c7 commit 61e001e

File tree

5 files changed

+57
-23
lines changed

5 files changed

+57
-23
lines changed

src/provider/provider_devdax_memory.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,10 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
130130
goto err_free_devdax_provider;
131131
}
132132

133-
devdax_provider->base = utils_devdax_mmap(NULL, devdax_provider->size,
134-
devdax_provider->protection, fd);
133+
// mmap /dev/dax with the MAP_SYNC xor MAP_SHARED flag (if MAP_SYNC fails)
134+
devdax_provider->base = utils_mmap_file(NULL, devdax_provider->size,
135+
devdax_provider->protection,
136+
0 /* flags */, fd, 0 /* offset */);
135137
utils_close_fd(fd);
136138
if (devdax_provider->base == NULL) {
137139
LOG_PDEBUG("devdax memory mapping failed (path=%s, size=%zu)",
@@ -458,8 +460,10 @@ static umf_result_t devdax_open_ipc_handle(void *provider,
458460
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
459461
}
460462

461-
char *base = utils_devdax_mmap(NULL, devdax_provider->size,
462-
devdax_provider->protection, fd);
463+
// mmap /dev/dax with the MAP_SYNC xor MAP_SHARED flag (if MAP_SYNC fails)
464+
char *base = utils_mmap_file(NULL, devdax_provider->size,
465+
devdax_provider->protection, 0 /* flags */, fd,
466+
0 /* offset */);
463467
if (base == NULL) {
464468
devdax_store_last_native_error(UMF_DEVDAX_RESULT_ERROR_ALLOC_FAILED,
465469
errno);

src/utils/utils_common.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ int utils_set_file_size(int fd, size_t size);
124124
void *utils_mmap(void *hint_addr, size_t length, int prot, int flag, int fd,
125125
size_t fd_offset);
126126

127-
void *utils_devdax_mmap(void *hint_addr, size_t length, int prot, int fd);
127+
void *utils_mmap_file(void *hint_addr, size_t length, int prot, int flags,
128+
int fd, size_t fd_offset);
128129

129130
int utils_munmap(void *addr, size_t length);
130131

src/utils/utils_linux_common.c

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,26 +36,49 @@ utils_translate_mem_visibility_flag(umf_memory_visibility_t in_flag,
3636
}
3737

3838
/*
39-
* MMap a /dev/dax device.
40-
* First try to mmap with (MAP_SHARED_VALIDATE | MAP_SYNC) flags
41-
* which allows flushing from the user-space. If MAP_SYNC fails
42-
* try to mmap with MAP_SHARED flag (without MAP_SYNC).
39+
* Map given file into memory.
40+
* If (flags & MAP_PRIVATE) it uses just mmap. Otherwise, it tries to mmap with
41+
* (flags | MAP_SHARED_VALIDATE | MAP_SYNC) which allows flushing from the
42+
* user-space. If MAP_SYNC fails and the user did not specify it by himself it
43+
* falls back to the mmap with user-provided flags.
4344
*/
44-
void *utils_devdax_mmap(void *hint_addr, size_t length, int prot, int fd) {
45-
void *ptr = utils_mmap(hint_addr, length, prot,
46-
MAP_SHARED_VALIDATE | MAP_SYNC, fd, 0);
47-
if (ptr) {
48-
LOG_DEBUG(
49-
"devdax mapped with the (MAP_SHARED_VALIDATE | MAP_SYNC) flags");
50-
return ptr;
45+
void *utils_mmap_file(void *hint_addr, size_t length, int prot, int flags,
46+
int fd, size_t fd_offset) {
47+
void *addr;
48+
49+
/*
50+
* MAP_PRIVATE and MAP_SHARED are mutually exclusive,
51+
* therefore mmap with MAP_PRIVATE is executed separately.
52+
*/
53+
if (flags & MAP_PRIVATE) {
54+
addr = utils_mmap(hint_addr, length, prot, flags, fd, fd_offset);
55+
if (addr == MAP_FAILED) {
56+
LOG_PERR("mapping file with the MAP_PRIVATE flag failed");
57+
return NULL;
58+
}
59+
60+
LOG_DEBUG("file mapped with the MAP_PRIVATE flag");
61+
return addr;
5162
}
5263

53-
ptr = utils_mmap(hint_addr, length, prot, MAP_SHARED, fd, 0);
54-
if (ptr) {
55-
LOG_DEBUG("devdax mapped with the MAP_SHARED flag");
56-
return ptr;
64+
/* try to mmap with MAP_SYNC flag */
65+
addr = utils_mmap(hint_addr, length, prot,
66+
flags | MAP_SHARED_VALIDATE | MAP_SYNC, fd, fd_offset);
67+
if (addr) {
68+
LOG_DEBUG("file mapped with the MAP_SYNC flag");
69+
return addr;
5770
}
5871

72+
/* try to mmap with MAP_SHARED flag (without MAP_SYNC) */
73+
addr =
74+
utils_mmap(hint_addr, length, prot, flags | MAP_SHARED, fd, fd_offset);
75+
if (addr) {
76+
LOG_DEBUG("file mapped with the MAP_SHARED flag");
77+
return addr;
78+
}
79+
80+
LOG_PERR("mapping file with the MAP_SHARED flag failed");
81+
5982
return NULL;
6083
}
6184

src/utils/utils_macosx_common.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,14 @@ utils_translate_mem_visibility_flag(umf_memory_visibility_t in_flag,
2727
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
2828
}
2929

30-
void *utils_devdax_mmap(void *hint_addr, size_t length, int prot, int fd) {
30+
void *utils_mmap_file(void *hint_addr, size_t length, int prot, int flags,
31+
int fd, size_t fd_offset) {
3132
(void)hint_addr; // unused
3233
(void)length; // unused
3334
(void)prot; // unused
35+
(void)flags; // unused
3436
(void)fd; // unused
37+
(void)fd_offset; // unused
3538
return NULL; // not supported
3639
}
3740

src/utils/utils_windows_common.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,12 +145,15 @@ void *utils_mmap(void *hint_addr, size_t length, int prot, int flag, int fd,
145145
return VirtualAlloc(hint_addr, length, MEM_RESERVE | MEM_COMMIT, prot);
146146
}
147147

148-
void *utils_devdax_mmap(void *hint_addr, size_t length, int prot, int fd) {
148+
void *utils_mmap_file(void *hint_addr, size_t length, int prot, int flags,
149+
int fd, size_t fd_offset) {
149150
(void)hint_addr; // unused
150151
(void)length; // unused
151152
(void)prot; // unused
153+
(void)flags; // unused
152154
(void)fd; // unused
153-
return NULL; // not supported on Windows
155+
(void)fd_offset; // unused
156+
return NULL; // not supported
154157
}
155158

156159
int utils_munmap(void *addr, size_t length) {

0 commit comments

Comments
 (0)