88#include <assert.h>
99#include <errno.h>
1010#include <limits.h>
11+ #include <stdbool.h>
1112#include <stddef.h>
1213#include <stdio.h>
1314#include <stdlib.h>
@@ -36,12 +37,13 @@ umf_memory_provider_ops_t *umfDevDaxMemoryProviderOps(void) {
3637#define TLS_MSG_BUF_LEN 1024
3738
3839typedef struct devdax_memory_provider_t {
39- char path [PATH_MAX ]; // a path to the device DAX
40- size_t size ; // size of the file used for memory mapping
41- void * base ; // base address of memory mapping
42- size_t offset ; // offset in the file used for memory mapping
43- utils_mutex_t lock ; // lock of ptr and offset
44- unsigned protection ; // combination of OS-specific protection flags
40+ char path [PATH_MAX ]; // a path to the device DAX
41+ size_t size ; // size of the file used for memory mapping
42+ void * base ; // base address of memory mapping
43+ size_t offset ; // offset in the file used for memory mapping
44+ utils_mutex_t lock ; // lock of ptr and offset
45+ unsigned protection ; // combination of OS-specific protection flags
46+ bool ipc_consumer_only_mode ; // when path==NULL and size==0
4547} devdax_memory_provider_t ;
4648
4749typedef struct devdax_last_native_error_t {
@@ -104,13 +106,9 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
104106 umf_devdax_memory_provider_params_t * in_params =
105107 (umf_devdax_memory_provider_params_t * )params ;
106108
107- if (in_params -> path == NULL ) {
108- LOG_ERR ("devdax path is missing" );
109- return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
110- }
111-
112- if (in_params -> size == 0 ) {
113- LOG_ERR ("devdax size is 0" );
109+ if (!(!in_params -> path == !in_params -> size )) {
110+ LOG_ERR (
111+ "both path and size of the devdax have to be provided or both not" );
114112 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
115113 }
116114
@@ -122,6 +120,14 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
122120
123121 memset (devdax_provider , 0 , sizeof (* devdax_provider ));
124122
123+ if (in_params -> path == NULL && in_params -> size == 0 ) {
124+ // IPC-consumer-only mode
125+ devdax_provider -> ipc_consumer_only_mode = true;
126+ LOG_INFO ("devdax provider started in the IPC-consumer-only mode" );
127+ * provider = devdax_provider ;
128+ return UMF_RESULT_SUCCESS ;
129+ }
130+
125131 ret = devdax_translate_params (in_params , devdax_provider );
126132 if (ret != UMF_RESULT_SUCCESS ) {
127133 goto err_free_devdax_provider ;
@@ -181,8 +187,12 @@ static void devdax_finalize(void *provider) {
181187 }
182188
183189 devdax_memory_provider_t * devdax_provider = provider ;
184- utils_mutex_destroy_not_free (& devdax_provider -> lock );
185- utils_munmap (devdax_provider -> base , devdax_provider -> size );
190+
191+ if (!devdax_provider -> ipc_consumer_only_mode ) {
192+ utils_mutex_destroy_not_free (& devdax_provider -> lock );
193+ utils_munmap (devdax_provider -> base , devdax_provider -> size );
194+ }
195+
186196 umf_ba_global_free (devdax_provider );
187197}
188198
@@ -224,7 +234,22 @@ static umf_result_t devdax_alloc(void *provider, size_t size, size_t alignment,
224234 void * * resultPtr ) {
225235 int ret ;
226236
227- if (provider == NULL || resultPtr == NULL ) {
237+ if (provider == NULL ) {
238+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
239+ }
240+
241+ devdax_memory_provider_t * devdax_provider =
242+ (devdax_memory_provider_t * )provider ;
243+
244+ if (devdax_provider -> ipc_consumer_only_mode ) {
245+ LOG_ERR ("devdax provider is working in the IPC-consumer-only mode" );
246+ if (resultPtr ) {
247+ * resultPtr = NULL ;
248+ }
249+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
250+ }
251+
252+ if (resultPtr == NULL ) {
228253 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
229254 }
230255
@@ -237,9 +262,6 @@ static umf_result_t devdax_alloc(void *provider, size_t size, size_t alignment,
237262 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
238263 }
239264
240- devdax_memory_provider_t * devdax_provider =
241- (devdax_memory_provider_t * )provider ;
242-
243265 void * addr = NULL ;
244266 errno = 0 ;
245267 ret = devdax_alloc_aligned (size , alignment , devdax_provider -> base ,
@@ -323,7 +345,19 @@ static umf_result_t devdax_purge_lazy(void *provider, void *ptr, size_t size) {
323345}
324346
325347static umf_result_t devdax_purge_force (void * provider , void * ptr , size_t size ) {
326- if (provider == NULL || ptr == NULL ) {
348+ if (provider == NULL ) {
349+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
350+ }
351+
352+ devdax_memory_provider_t * devdax_provider =
353+ (devdax_memory_provider_t * )provider ;
354+
355+ if (devdax_provider -> ipc_consumer_only_mode ) {
356+ LOG_ERR ("devdax provider is working in the IPC-consumer-only mode" );
357+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
358+ }
359+
360+ if (ptr == NULL ) {
327361 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
328362 }
329363
@@ -345,17 +379,38 @@ static const char *devdax_get_name(void *provider) {
345379static umf_result_t devdax_allocation_split (void * provider , void * ptr ,
346380 size_t totalSize ,
347381 size_t firstSize ) {
348- (void )provider ;
349382 (void )ptr ;
350383 (void )totalSize ;
351384 (void )firstSize ;
352385
386+ if (provider == NULL ) {
387+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
388+ }
389+
390+ devdax_memory_provider_t * devdax_provider =
391+ (devdax_memory_provider_t * )provider ;
392+
393+ if (devdax_provider -> ipc_consumer_only_mode ) {
394+ LOG_ERR ("devdax provider is working in the IPC-consumer-only mode" );
395+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
396+ }
397+
353398 return UMF_RESULT_SUCCESS ;
354399}
355400
356401static umf_result_t devdax_allocation_merge (void * provider , void * lowPtr ,
357402 void * highPtr , size_t totalSize ) {
358- (void )provider ;
403+ if (provider == NULL ) {
404+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
405+ }
406+
407+ devdax_memory_provider_t * devdax_provider =
408+ (devdax_memory_provider_t * )provider ;
409+
410+ if (devdax_provider -> ipc_consumer_only_mode ) {
411+ LOG_ERR ("devdax provider is working in the IPC-consumer-only mode" );
412+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
413+ }
359414
360415 if ((uintptr_t )highPtr <= (uintptr_t )lowPtr ) {
361416 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
@@ -387,13 +442,22 @@ static umf_result_t devdax_get_ipc_handle_size(void *provider, size_t *size) {
387442
388443static umf_result_t devdax_get_ipc_handle (void * provider , const void * ptr ,
389444 size_t size , void * providerIpcData ) {
390- if (provider == NULL || ptr == NULL || providerIpcData == NULL ) {
445+ if (provider == NULL ) {
391446 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
392447 }
393448
394449 devdax_memory_provider_t * devdax_provider =
395450 (devdax_memory_provider_t * )provider ;
396451
452+ if (devdax_provider -> ipc_consumer_only_mode ) {
453+ LOG_ERR ("devdax provider is working in the IPC-consumer-only mode" );
454+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
455+ }
456+
457+ if (ptr == NULL || providerIpcData == NULL ) {
458+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
459+ }
460+
397461 devdax_ipc_data_t * devdax_ipc_data = (devdax_ipc_data_t * )providerIpcData ;
398462 strncpy (devdax_ipc_data -> path , devdax_provider -> path , PATH_MAX - 1 );
399463 devdax_ipc_data -> path [PATH_MAX - 1 ] = '\0' ;
@@ -407,12 +471,22 @@ static umf_result_t devdax_get_ipc_handle(void *provider, const void *ptr,
407471
408472static umf_result_t devdax_put_ipc_handle (void * provider ,
409473 void * providerIpcData ) {
410- if (provider == NULL || providerIpcData == NULL ) {
474+ if (provider == NULL ) {
411475 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
412476 }
413477
414478 devdax_memory_provider_t * devdax_provider =
415479 (devdax_memory_provider_t * )provider ;
480+
481+ if (devdax_provider -> ipc_consumer_only_mode ) {
482+ LOG_ERR ("devdax provider is working in the IPC-consumer-only mode" );
483+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
484+ }
485+
486+ if (providerIpcData == NULL ) {
487+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
488+ }
489+
416490 devdax_ipc_data_t * devdax_ipc_data = (devdax_ipc_data_t * )providerIpcData ;
417491
418492 // verify the path of the /dev/dax
0 commit comments