Skip to content

Commit e6ab51b

Browse files
committed
Make utils_mmap_file() detect DAX using MAP_SYNC flag
Make utils_mmap_file() detect DAX using MAP_SYNC flag. Add bool *map_sync argument to utils_mmap_file(). map_sync is set to true only if memory was mapped with MAP_SYNC, what means it is a DAX file/device. Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 3ab25d0 commit e6ab51b

File tree

6 files changed

+49
-41
lines changed

6 files changed

+49
-41
lines changed

src/provider/provider_devdax_memory.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,9 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
143143
utils_translate_mem_visibility_flag(UMF_MEM_MAP_SYNC, &map_sync_flag);
144144

145145
// mmap /dev/dax with the MAP_SYNC xor MAP_SHARED flag (if MAP_SYNC fails)
146-
devdax_provider->base = utils_mmap_file(NULL, devdax_provider->size,
147-
devdax_provider->protection,
148-
map_sync_flag, fd, 0 /* offset */);
146+
devdax_provider->base = utils_mmap_file(
147+
NULL, devdax_provider->size, devdax_provider->protection, map_sync_flag,
148+
fd, 0 /* offset */, NULL);
149149
utils_close_fd(fd);
150150
if (devdax_provider->base == NULL) {
151151
LOG_PDEBUG("devdax memory mapping failed (path=%s, size=%zu)",
@@ -455,7 +455,7 @@ static umf_result_t devdax_open_ipc_handle(void *provider,
455455
// mmap /dev/dax with the MAP_SYNC xor MAP_SHARED flag (if MAP_SYNC fails)
456456
char *addr =
457457
utils_mmap_file(NULL, length_aligned, devdax_ipc_data->protection,
458-
map_sync_flag, fd, offset_aligned);
458+
map_sync_flag, fd, offset_aligned, NULL);
459459
if (addr == NULL) {
460460
devdax_store_last_native_error(UMF_DEVDAX_RESULT_ERROR_ALLOC_FAILED,
461461
errno);

src/provider/provider_file_memory.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -293,8 +293,8 @@ static umf_result_t file_mmap_aligned(file_memory_provider_t *file_provider,
293293
ASSERT_IS_ALIGNED(extended_size, page_size);
294294
ASSERT_IS_ALIGNED(aligned_offset_fd, page_size);
295295

296-
void *ptr =
297-
utils_mmap_file(NULL, extended_size, prot, flag, fd, aligned_offset_fd);
296+
void *ptr = utils_mmap_file(NULL, extended_size, prot, flag, fd,
297+
aligned_offset_fd, NULL);
298298
if (ptr == NULL) {
299299
LOG_PERR("memory mapping failed");
300300
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
@@ -683,7 +683,7 @@ static umf_result_t file_open_ipc_handle(void *provider, void *providerIpcData,
683683

684684
char *addr = utils_mmap_file(
685685
NULL, file_ipc_data->size, file_ipc_data->protection,
686-
file_ipc_data->visibility, fd, file_ipc_data->offset_fd);
686+
file_ipc_data->visibility, fd, file_ipc_data->offset_fd, NULL);
687687
(void)utils_close_fd(fd);
688688
if (addr == NULL) {
689689
file_store_last_native_error(UMF_FILE_RESULT_ERROR_ALLOC_FAILED, errno);

src/utils/utils_common.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#define UMF_COMMON_H 1
1212

1313
#include <assert.h>
14+
#include <stdbool.h>
1415
#include <stddef.h>
1516
#include <stdint.h>
1617

@@ -136,7 +137,7 @@ void *utils_mmap(void *hint_addr, size_t length, int prot, int flag, int fd,
136137
size_t fd_offset);
137138

138139
void *utils_mmap_file(void *hint_addr, size_t length, int prot, int flags,
139-
int fd, size_t fd_offset);
140+
int fd, size_t fd_offset, bool *map_sync);
140141

141142
int utils_munmap(void *addr, size_t length);
142143

src/utils/utils_linux_common.c

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include <errno.h>
1111
#include <fcntl.h>
12+
#include <stdbool.h>
1213
#include <sys/mman.h>
1314
#include <sys/stat.h>
1415
#include <sys/syscall.h>
@@ -40,69 +41,72 @@ utils_translate_mem_visibility_flag(umf_memory_visibility_t in_flag,
4041

4142
/*
4243
* Map given file into memory.
43-
* If (flags & MAP_PRIVATE) it uses just mmap. Otherwise, if (flags & MAP_SYNC)
44-
* it tries to mmap with (flags | MAP_SHARED_VALIDATE | MAP_SYNC)
45-
* which allows flushing from the user-space. If MAP_SYNC fails and the user
46-
* did not specify it by himself it tries to mmap with (flags | MAP_SHARED).
44+
* If (flags & MAP_PRIVATE) it uses just mmap. Otherwise, it tries to mmap
45+
* with (flags | MAP_SHARED_VALIDATE | MAP_SYNC) which allows flushing
46+
* from the user-space. If MAP_SYNC fails and if the user did not specify
47+
* this flag by himself, it falls back to the mmap with (flags | MAP_SHARED).
4748
*/
4849
void *utils_mmap_file(void *hint_addr, size_t length, int prot, int flags,
49-
int fd, size_t fd_offset) {
50+
int fd, size_t fd_offset, bool *map_sync) {
5051
void *addr;
5152

53+
if (map_sync) {
54+
*map_sync = false;
55+
}
56+
5257
/*
5358
* MAP_PRIVATE and MAP_SHARED are mutually exclusive,
5459
* therefore mmap with MAP_PRIVATE is executed separately.
5560
*/
5661
if (flags & MAP_PRIVATE) {
5762
addr = utils_mmap(hint_addr, length, prot, flags, fd, fd_offset);
58-
if (addr == MAP_FAILED) {
63+
if (addr == NULL) {
5964
LOG_PERR("mapping file with the MAP_PRIVATE flag failed (fd=%i, "
60-
"offset=%zu, length=%zu)",
61-
fd, fd_offset, length);
65+
"offset=%zu, length=%zu, flags=%i)",
66+
fd, fd_offset, length, flags);
6267
return NULL;
6368
}
6469

6570
LOG_DEBUG("file mapped with the MAP_PRIVATE flag (fd=%i, offset=%zu, "
66-
"length=%zu)",
67-
fd, fd_offset, length);
71+
"length=%zu, flags=%i)",
72+
fd, fd_offset, length, flags);
6873

6974
return addr;
7075
}
7176

7277
errno = 0;
7378

74-
if (flags & MAP_SYNC) {
75-
/* try to mmap with MAP_SYNC flag */
76-
const int sync_flags = MAP_SHARED_VALIDATE | MAP_SYNC;
77-
addr = utils_mmap(hint_addr, length, prot, flags | sync_flags, fd,
78-
fd_offset);
79-
if (addr) {
80-
LOG_DEBUG("file mapped with the MAP_SYNC flag (fd=%i, offset=%zu, "
81-
"length=%zu)",
82-
fd, fd_offset, length);
83-
return addr;
79+
/* try to mmap with MAP_SYNC flag */
80+
const int sync_flags = flags | MAP_SHARED_VALIDATE | MAP_SYNC;
81+
addr = utils_mmap(hint_addr, length, prot, sync_flags, fd, fd_offset);
82+
if (addr) {
83+
LOG_DEBUG("file mapped with the MAP_SYNC flag (fd=%i, offset=%zu, "
84+
"length=%zu, flags=%i)",
85+
fd, fd_offset, length, sync_flags);
86+
if (map_sync) {
87+
*map_sync = true;
8488
}
85-
86-
LOG_PERR("mapping file with the MAP_SYNC flag failed (fd=%i, "
87-
"offset=%zu, length=%zu)",
88-
fd, fd_offset, length);
89+
return addr;
8990
}
9091

91-
if ((!(flags & MAP_SYNC)) || errno == EINVAL || errno == ENOTSUP ||
92-
errno == EOPNOTSUPP) {
93-
/* try to mmap with MAP_SHARED flag (without MAP_SYNC) */
92+
LOG_PERR("mapping file with the MAP_SYNC flag failed (fd=%i, offset=%zu, "
93+
"length=%zu, flags=%i)",
94+
fd, fd_offset, length, sync_flags);
95+
96+
/* try to mmap with MAP_SHARED flag (without MAP_SYNC) */
97+
if (errno == EINVAL || errno == ENOTSUP || errno == EOPNOTSUPP) {
9498
const int shared_flags = (flags & (~MAP_SYNC)) | MAP_SHARED;
9599
addr = utils_mmap(hint_addr, length, prot, shared_flags, fd, fd_offset);
96100
if (addr) {
97101
LOG_DEBUG("file mapped with the MAP_SHARED flag (fd=%i, "
98-
"offset=%zu, length=%zu)",
99-
fd, fd_offset, length);
102+
"offset=%zu, length=%zu, flags=%i)",
103+
fd, fd_offset, length, shared_flags);
100104
return addr;
101105
}
102106

103107
LOG_PERR("mapping file with the MAP_SHARED flag failed (fd=%i, "
104-
"offset=%zu, length=%zu)",
105-
fd, fd_offset, length);
108+
"offset=%zu, length=%zu, flags=%i)",
109+
fd, fd_offset, length, shared_flags);
106110
}
107111

108112
return NULL;

src/utils/utils_macosx_common.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <umf/base.h>
1313
#include <umf/memory_provider.h>
1414

15+
#include "utils_common.h"
1516
#include "utils_log.h"
1617

1718
umf_result_t
@@ -30,13 +31,14 @@ utils_translate_mem_visibility_flag(umf_memory_visibility_t in_flag,
3031
}
3132

3233
void *utils_mmap_file(void *hint_addr, size_t length, int prot, int flags,
33-
int fd, size_t fd_offset) {
34+
int fd, size_t fd_offset, bool *map_sync) {
3435
(void)hint_addr; // unused
3536
(void)length; // unused
3637
(void)prot; // unused
3738
(void)flags; // unused
3839
(void)fd; // unused
3940
(void)fd_offset; // unused
41+
(void)map_sync; // unused
4042
return NULL; // not supported
4143
}
4244

src/utils/utils_windows_common.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,14 @@ void *utils_mmap(void *hint_addr, size_t length, int prot, int flag, int fd,
148148
}
149149

150150
void *utils_mmap_file(void *hint_addr, size_t length, int prot, int flags,
151-
int fd, size_t fd_offset) {
151+
int fd, size_t fd_offset, bool *map_sync) {
152152
(void)hint_addr; // unused
153153
(void)length; // unused
154154
(void)prot; // unused
155155
(void)flags; // unused
156156
(void)fd; // unused
157157
(void)fd_offset; // unused
158+
(void)map_sync; // unused
158159
return NULL; // not supported
159160
}
160161

0 commit comments

Comments
 (0)