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>
@@ -31,78 +32,78 @@ utils_translate_mem_visibility_flag(umf_memory_visibility_t in_flag,
3132 case UMF_MEM_MAP_SHARED :
3233 * out_flag = MAP_SHARED ;
3334 return UMF_RESULT_SUCCESS ;
34- case UMF_MEM_MAP_SYNC :
35- * out_flag = MAP_SYNC ;
36- return UMF_RESULT_SUCCESS ;
3735 }
3836 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
3937}
4038
4139/*
4240 * 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).
4745 */
4846void * 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 ) {
5048 void * addr ;
5149
50+ if (map_sync ) {
51+ * map_sync = false;
52+ }
53+
5254 /*
5355 * MAP_PRIVATE and MAP_SHARED are mutually exclusive,
5456 * therefore mmap with MAP_PRIVATE is executed separately.
5557 */
5658 if (flags & MAP_PRIVATE ) {
5759 addr = utils_mmap (hint_addr , length , prot , flags , fd , fd_offset );
58- if (addr == MAP_FAILED ) {
60+ if (addr == NULL ) {
5961 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 );
6264 return NULL ;
6365 }
6466
6567 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 );
6870
6971 return addr ;
7072 }
7173
7274 errno = 0 ;
7375
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;
8485 }
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 ;
8987 }
9088
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 ;
9596 addr = utils_mmap (hint_addr , length , prot , shared_flags , fd , fd_offset );
9697 if (addr ) {
9798 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 );
100101 return addr ;
101102 }
102103
103104 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 );
106107 }
107108
108109 return NULL ;
0 commit comments