8
8
#include <assert.h>
9
9
#include <errno.h>
10
10
#include <limits.h>
11
+ #include <stdbool.h>
11
12
#include <stddef.h>
12
13
#include <stdio.h>
13
14
#include <stdlib.h>
@@ -36,12 +37,13 @@ umf_memory_provider_ops_t *umfDevDaxMemoryProviderOps(void) {
36
37
#define TLS_MSG_BUF_LEN 1024
37
38
38
39
typedef 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
45
47
} devdax_memory_provider_t ;
46
48
47
49
typedef struct devdax_last_native_error_t {
@@ -104,13 +106,9 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
104
106
umf_devdax_memory_provider_params_t * in_params =
105
107
(umf_devdax_memory_provider_params_t * )params ;
106
108
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" );
114
112
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
115
113
}
116
114
@@ -122,6 +120,14 @@ static umf_result_t devdax_initialize(void *params, void **provider) {
122
120
123
121
memset (devdax_provider , 0 , sizeof (* devdax_provider ));
124
122
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
+
125
131
ret = devdax_translate_params (in_params , devdax_provider );
126
132
if (ret != UMF_RESULT_SUCCESS ) {
127
133
goto err_free_devdax_provider ;
@@ -181,8 +187,12 @@ static void devdax_finalize(void *provider) {
181
187
}
182
188
183
189
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
+
186
196
umf_ba_global_free (devdax_provider );
187
197
}
188
198
@@ -224,7 +234,19 @@ static umf_result_t devdax_alloc(void *provider, size_t size, size_t alignment,
224
234
void * * resultPtr ) {
225
235
int ret ;
226
236
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
+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
247
+ }
248
+
249
+ if (resultPtr == NULL ) {
228
250
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
229
251
}
230
252
@@ -237,9 +259,6 @@ static umf_result_t devdax_alloc(void *provider, size_t size, size_t alignment,
237
259
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
238
260
}
239
261
240
- devdax_memory_provider_t * devdax_provider =
241
- (devdax_memory_provider_t * )provider ;
242
-
243
262
void * addr = NULL ;
244
263
errno = 0 ;
245
264
ret = devdax_alloc_aligned (size , alignment , devdax_provider -> base ,
@@ -323,7 +342,19 @@ static umf_result_t devdax_purge_lazy(void *provider, void *ptr, size_t size) {
323
342
}
324
343
325
344
static umf_result_t devdax_purge_force (void * provider , void * ptr , size_t size ) {
326
- if (provider == NULL || ptr == NULL ) {
345
+ if (provider == NULL ) {
346
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
347
+ }
348
+
349
+ devdax_memory_provider_t * devdax_provider =
350
+ (devdax_memory_provider_t * )provider ;
351
+
352
+ if (devdax_provider -> ipc_consumer_only_mode ) {
353
+ LOG_ERR ("devdax provider is working in the IPC-consumer-only mode" );
354
+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
355
+ }
356
+
357
+ if (ptr == NULL ) {
327
358
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
328
359
}
329
360
@@ -345,17 +376,38 @@ static const char *devdax_get_name(void *provider) {
345
376
static umf_result_t devdax_allocation_split (void * provider , void * ptr ,
346
377
size_t totalSize ,
347
378
size_t firstSize ) {
348
- (void )provider ;
349
379
(void )ptr ;
350
380
(void )totalSize ;
351
381
(void )firstSize ;
352
382
383
+ if (provider == NULL ) {
384
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
385
+ }
386
+
387
+ devdax_memory_provider_t * devdax_provider =
388
+ (devdax_memory_provider_t * )provider ;
389
+
390
+ if (devdax_provider -> ipc_consumer_only_mode ) {
391
+ LOG_ERR ("devdax provider is working in the IPC-consumer-only mode" );
392
+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
393
+ }
394
+
353
395
return UMF_RESULT_SUCCESS ;
354
396
}
355
397
356
398
static umf_result_t devdax_allocation_merge (void * provider , void * lowPtr ,
357
399
void * highPtr , size_t totalSize ) {
358
- (void )provider ;
400
+ if (provider == NULL ) {
401
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
402
+ }
403
+
404
+ devdax_memory_provider_t * devdax_provider =
405
+ (devdax_memory_provider_t * )provider ;
406
+
407
+ if (devdax_provider -> ipc_consumer_only_mode ) {
408
+ LOG_ERR ("devdax provider is working in the IPC-consumer-only mode" );
409
+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
410
+ }
359
411
360
412
if ((uintptr_t )highPtr <= (uintptr_t )lowPtr ) {
361
413
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
0 commit comments