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>
@@ -31,78 +32,78 @@ utils_translate_mem_visibility_flag(umf_memory_visibility_t in_flag,
31
32
case UMF_MEM_MAP_SHARED :
32
33
* out_flag = MAP_SHARED ;
33
34
return UMF_RESULT_SUCCESS ;
34
- case UMF_MEM_MAP_SYNC :
35
- * out_flag = MAP_SYNC ;
36
- return UMF_RESULT_SUCCESS ;
37
35
}
38
36
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
39
37
}
40
38
41
39
/*
42
40
* 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).
41
+ * If (flags & MAP_PRIVATE) it uses just mmap. Otherwise, it tries to mmap
42
+ * with (flags | MAP_SHARED_VALIDATE | MAP_SYNC) which allows flushing
43
+ * from the user-space. If MAP_SYNC fails and if the user did not specify
44
+ * this flag by himself, it falls back to the mmap with (flags | MAP_SHARED).
47
45
*/
48
46
void * utils_mmap_file (void * hint_addr , size_t length , int prot , int flags ,
49
- int fd , size_t fd_offset ) {
47
+ int fd , size_t fd_offset , bool * map_sync ) {
50
48
void * addr ;
51
49
50
+ if (map_sync ) {
51
+ * map_sync = false;
52
+ }
53
+
52
54
/*
53
55
* MAP_PRIVATE and MAP_SHARED are mutually exclusive,
54
56
* therefore mmap with MAP_PRIVATE is executed separately.
55
57
*/
56
58
if (flags & MAP_PRIVATE ) {
57
59
addr = utils_mmap (hint_addr , length , prot , flags , fd , fd_offset );
58
- if (addr == MAP_FAILED ) {
60
+ if (addr == NULL ) {
59
61
LOG_PERR ("mapping file with the MAP_PRIVATE flag failed (fd=%i, "
60
- "offset=%zu, length=%zu)" ,
61
- fd , fd_offset , length );
62
+ "offset=%zu, length=%zu, flags=%i )" ,
63
+ fd , fd_offset , length , flags );
62
64
return NULL ;
63
65
}
64
66
65
67
LOG_DEBUG ("file mapped with the MAP_PRIVATE flag (fd=%i, offset=%zu, "
66
- "length=%zu)" ,
67
- fd , fd_offset , length );
68
+ "length=%zu, flags=%i )" ,
69
+ fd , fd_offset , length , flags );
68
70
69
71
return addr ;
70
72
}
71
73
72
74
errno = 0 ;
73
75
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 ;
76
+ /* try to mmap with MAP_SYNC flag */
77
+ const int sync_flags = flags | MAP_SHARED_VALIDATE | MAP_SYNC ;
78
+ addr = utils_mmap (hint_addr , length , prot , sync_flags , fd , fd_offset );
79
+ if (addr ) {
80
+ LOG_DEBUG ("file mapped with the MAP_SYNC flag (fd=%i, offset=%zu, "
81
+ "length=%zu, flags=%i)" ,
82
+ fd , fd_offset , length , sync_flags );
83
+ if (map_sync ) {
84
+ * map_sync = true;
84
85
}
85
-
86
- LOG_PERR ("mapping file with the MAP_SYNC flag failed (fd=%i, "
87
- "offset=%zu, length=%zu)" ,
88
- fd , fd_offset , length );
86
+ return addr ;
89
87
}
90
88
91
- if ((!(flags & MAP_SYNC )) || errno == EINVAL || errno == ENOTSUP ||
92
- errno == EOPNOTSUPP ) {
93
- /* try to mmap with MAP_SHARED flag (without MAP_SYNC) */
94
- const int shared_flags = (flags & (~MAP_SYNC )) | MAP_SHARED ;
89
+ LOG_PERR ("mapping file with the MAP_SYNC flag failed (fd=%i, offset=%zu, "
90
+ "length=%zu, flags=%i)" ,
91
+ fd , fd_offset , length , sync_flags );
92
+
93
+ /* try to mmap with MAP_SHARED flag (without MAP_SYNC) */
94
+ if (errno == EINVAL || errno == ENOTSUP || errno == EOPNOTSUPP ) {
95
+ const int shared_flags = flags | MAP_SHARED ;
95
96
addr = utils_mmap (hint_addr , length , prot , shared_flags , fd , fd_offset );
96
97
if (addr ) {
97
98
LOG_DEBUG ("file mapped with the MAP_SHARED flag (fd=%i, "
98
- "offset=%zu, length=%zu)" ,
99
- fd , fd_offset , length );
99
+ "offset=%zu, length=%zu, flags=%i )" ,
100
+ fd , fd_offset , length , shared_flags );
100
101
return addr ;
101
102
}
102
103
103
104
LOG_PERR ("mapping file with the MAP_SHARED flag failed (fd=%i, "
104
- "offset=%zu, length=%zu)" ,
105
- fd , fd_offset , length );
105
+ "offset=%zu, length=%zu, flags=%i )" ,
106
+ fd , fd_offset , length , shared_flags );
106
107
}
107
108
108
109
return NULL ;
0 commit comments