@@ -33,12 +33,15 @@ umf_memory_provider_ops_t *umfFileMemoryProviderOps(void) {
3333#include "utils_concurrency.h"
3434#include "utils_log.h"
3535
36+ #define FSDAX_PAGE_SIZE_2MB ((size_t)(2 * 1024 * 1024)) // == 2 MB
37+
3638#define TLS_MSG_BUF_LEN 1024
3739
3840typedef struct file_memory_provider_t {
3941 utils_mutex_t lock ; // lock for file parameters (size and offsets)
4042
4143 char path [PATH_MAX ]; // a path to the file
44+ bool is_fsdax ; // true if the file is located on FSDAX
4245 int fd ; // file descriptor for memory mapping
4346 size_t size_fd ; // size of the file used for memory mappings
4447 size_t offset_fd ; // offset in the file used for memory mappings
@@ -131,7 +134,11 @@ static umf_result_t file_initialize(void *params, void **provider) {
131134 umf_file_memory_provider_params_t * in_params =
132135 (umf_file_memory_provider_params_t * )params ;
133136
134- size_t page_size = utils_get_page_size ();
137+ if (in_params -> is_fsdax && in_params -> visibility != UMF_MEM_MAP_SYNC ) {
138+ LOG_ERR ("memory visibility has to be set to UMF_MEM_MAP_SYNC in case "
139+ "of FSDAX" );
140+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
141+ }
135142
136143 if (in_params -> path == NULL ) {
137144 LOG_ERR ("file path is missing" );
@@ -146,7 +153,12 @@ static umf_result_t file_initialize(void *params, void **provider) {
146153
147154 memset (file_provider , 0 , sizeof (* file_provider ));
148155
149- file_provider -> page_size = page_size ;
156+ file_provider -> is_fsdax = in_params -> is_fsdax ;
157+ if (file_provider -> is_fsdax ) {
158+ file_provider -> page_size = FSDAX_PAGE_SIZE_2MB ;
159+ } else {
160+ file_provider -> page_size = utils_get_page_size ();
161+ }
150162
151163 ret = file_translate_params (in_params , file_provider );
152164 if (ret != UMF_RESULT_SUCCESS ) {
@@ -164,13 +176,13 @@ static umf_result_t file_initialize(void *params, void **provider) {
164176 goto err_free_file_provider ;
165177 }
166178
167- if (utils_set_file_size (file_provider -> fd , page_size )) {
179+ if (utils_set_file_size (file_provider -> fd , file_provider -> page_size )) {
168180 LOG_ERR ("cannot set size of the file: %s" , in_params -> path );
169181 ret = UMF_RESULT_ERROR_UNKNOWN ;
170182 goto err_close_fd ;
171183 }
172184
173- file_provider -> size_fd = page_size ;
185+ file_provider -> size_fd = file_provider -> page_size ;
174186
175187 LOG_DEBUG ("size of the file %s is: %zu" , in_params -> path ,
176188 file_provider -> size_fd );
@@ -481,7 +493,8 @@ static umf_result_t file_get_recommended_page_size(void *provider, size_t size,
481493 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
482494 }
483495
484- * page_size = utils_get_page_size ();
496+ file_memory_provider_t * file_provider = (file_memory_provider_t * )provider ;
497+ * page_size = file_provider -> page_size ;
485498
486499 return UMF_RESULT_SUCCESS ;
487500}
0 commit comments