@@ -33,12 +33,15 @@ umf_memory_provider_ops_t *umfFileMemoryProviderOps(void) {
33
33
#include "utils_concurrency.h"
34
34
#include "utils_log.h"
35
35
36
+ #define FSDAX_PAGE_SIZE_2MB ((size_t)(2 * 1024 * 1024)) // == 2 MB
37
+
36
38
#define TLS_MSG_BUF_LEN 1024
37
39
38
40
typedef struct file_memory_provider_t {
39
41
utils_mutex_t lock ; // lock for file parameters (size and offsets)
40
42
41
43
char path [PATH_MAX ]; // a path to the file
44
+ bool is_fsdax ; // true if file is located on FSDAX
42
45
int fd ; // file descriptor for memory mapping
43
46
size_t size_fd ; // size of the file used for memory mappings
44
47
size_t offset_fd ; // offset in the file used for memory mappings
@@ -163,17 +166,28 @@ static umf_result_t file_initialize(void *params, void **provider) {
163
166
goto err_free_file_provider ;
164
167
}
165
168
166
- if (utils_set_file_size (file_provider -> fd , page_size )) {
169
+ if (utils_set_file_size (file_provider -> fd , FSDAX_PAGE_SIZE_2MB )) {
167
170
LOG_ERR ("cannot set size of the file: %s" , in_params -> path );
168
171
ret = UMF_RESULT_ERROR_UNKNOWN ;
169
172
goto err_close_fd ;
170
173
}
171
174
172
- file_provider -> size_fd = page_size ;
175
+ file_provider -> size_fd = FSDAX_PAGE_SIZE_2MB ;
173
176
174
177
LOG_DEBUG ("size of the file %s is: %zu" , in_params -> path ,
175
178
file_provider -> size_fd );
176
179
180
+ if (!(in_params -> visibility & UMF_MEM_MAP_PRIVATE )) {
181
+ // check if file is located on FSDAX
182
+ void * addr = utils_mmap_file (
183
+ NULL , file_provider -> size_fd , file_provider -> protection ,
184
+ file_provider -> visibility , file_provider -> fd , 0 ,
185
+ & file_provider -> is_fsdax );
186
+ if (addr ) {
187
+ utils_munmap (addr , file_provider -> size_fd );
188
+ }
189
+ }
190
+
177
191
if (utils_mutex_init (& file_provider -> lock ) == NULL ) {
178
192
LOG_ERR ("lock init failed" );
179
193
ret = UMF_RESULT_ERROR_UNKNOWN ;
0 commit comments