|
9 | 9 |
|
10 | 10 | #include <errno.h>
|
11 | 11 | #include <fcntl.h>
|
| 12 | +#include <stdbool.h> |
12 | 13 | #include <sys/mman.h>
|
13 | 14 | #include <sys/stat.h>
|
14 | 15 | #include <sys/syscall.h>
|
@@ -40,69 +41,72 @@ utils_translate_mem_visibility_flag(umf_memory_visibility_t in_flag,
|
40 | 41 |
|
41 | 42 | /*
|
42 | 43 | * 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). |
47 | 48 | */
|
48 | 49 | 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) { |
50 | 51 | void *addr;
|
51 | 52 |
|
| 53 | + if (map_sync) { |
| 54 | + *map_sync = false; |
| 55 | + } |
| 56 | + |
52 | 57 | /*
|
53 | 58 | * MAP_PRIVATE and MAP_SHARED are mutually exclusive,
|
54 | 59 | * therefore mmap with MAP_PRIVATE is executed separately.
|
55 | 60 | */
|
56 | 61 | if (flags & MAP_PRIVATE) {
|
57 | 62 | addr = utils_mmap(hint_addr, length, prot, flags, fd, fd_offset);
|
58 |
| - if (addr == MAP_FAILED) { |
| 63 | + if (addr == NULL) { |
59 | 64 | 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); |
62 | 67 | return NULL;
|
63 | 68 | }
|
64 | 69 |
|
65 | 70 | 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); |
68 | 73 |
|
69 | 74 | return addr;
|
70 | 75 | }
|
71 | 76 |
|
72 | 77 | errno = 0;
|
73 | 78 |
|
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; |
84 | 88 | }
|
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; |
89 | 90 | }
|
90 | 91 |
|
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) { |
94 | 98 | const int shared_flags = (flags & (~MAP_SYNC)) | MAP_SHARED;
|
95 | 99 | addr = utils_mmap(hint_addr, length, prot, shared_flags, fd, fd_offset);
|
96 | 100 | if (addr) {
|
97 | 101 | 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); |
100 | 104 | return addr;
|
101 | 105 | }
|
102 | 106 |
|
103 | 107 | 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); |
106 | 110 | }
|
107 | 111 |
|
108 | 112 | return NULL;
|
|
0 commit comments