@@ -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
@@ -164,17 +167,28 @@ static umf_result_t file_initialize(void *params, void **provider) {
164
167
goto err_free_file_provider ;
165
168
}
166
169
167
- if (utils_set_file_size (file_provider -> fd , page_size )) {
170
+ if (utils_set_file_size (file_provider -> fd , FSDAX_PAGE_SIZE_2MB )) {
168
171
LOG_ERR ("cannot set size of the file: %s" , in_params -> path );
169
172
ret = UMF_RESULT_ERROR_UNKNOWN ;
170
173
goto err_close_fd ;
171
174
}
172
175
173
- file_provider -> size_fd = page_size ;
176
+ file_provider -> size_fd = FSDAX_PAGE_SIZE_2MB ;
174
177
175
178
LOG_DEBUG ("size of the file %s is: %zu" , in_params -> path ,
176
179
file_provider -> size_fd );
177
180
181
+ // check if file is located on FSDAX
182
+ if (in_params -> visibility == UMF_MEM_MAP_SYNC ) {
183
+ void * addr = utils_mmap_file (
184
+ NULL , file_provider -> size_fd , file_provider -> protection ,
185
+ file_provider -> visibility , file_provider -> fd , 0 ,
186
+ & file_provider -> is_fsdax );
187
+ if (addr ) {
188
+ utils_munmap (addr , file_provider -> size_fd );
189
+ }
190
+ }
191
+
178
192
if (utils_mutex_init (& file_provider -> lock ) == NULL ) {
179
193
LOG_ERR ("lock init failed" );
180
194
ret = UMF_RESULT_ERROR_UNKNOWN ;
0 commit comments