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,22 @@ 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
+ if (resultPtr ) {
247
+ * resultPtr = NULL ;
248
+ }
249
+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
250
+ }
251
+
252
+ if (resultPtr == NULL ) {
228
253
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
229
254
}
230
255
@@ -237,9 +262,6 @@ static umf_result_t devdax_alloc(void *provider, size_t size, size_t alignment,
237
262
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
238
263
}
239
264
240
- devdax_memory_provider_t * devdax_provider =
241
- (devdax_memory_provider_t * )provider ;
242
-
243
265
void * addr = NULL ;
244
266
errno = 0 ;
245
267
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) {
323
345
}
324
346
325
347
static 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 ) {
327
361
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
328
362
}
329
363
@@ -345,17 +379,38 @@ static const char *devdax_get_name(void *provider) {
345
379
static umf_result_t devdax_allocation_split (void * provider , void * ptr ,
346
380
size_t totalSize ,
347
381
size_t firstSize ) {
348
- (void )provider ;
349
382
(void )ptr ;
350
383
(void )totalSize ;
351
384
(void )firstSize ;
352
385
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
+
353
398
return UMF_RESULT_SUCCESS ;
354
399
}
355
400
356
401
static umf_result_t devdax_allocation_merge (void * provider , void * lowPtr ,
357
402
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
+ }
359
414
360
415
if ((uintptr_t )highPtr <= (uintptr_t )lowPtr ) {
361
416
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
@@ -387,13 +442,22 @@ static umf_result_t devdax_get_ipc_handle_size(void *provider, size_t *size) {
387
442
388
443
static umf_result_t devdax_get_ipc_handle (void * provider , const void * ptr ,
389
444
size_t size , void * providerIpcData ) {
390
- if (provider == NULL || ptr == NULL || providerIpcData == NULL ) {
445
+ if (provider == NULL ) {
391
446
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
392
447
}
393
448
394
449
devdax_memory_provider_t * devdax_provider =
395
450
(devdax_memory_provider_t * )provider ;
396
451
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
+
397
461
devdax_ipc_data_t * devdax_ipc_data = (devdax_ipc_data_t * )providerIpcData ;
398
462
strncpy (devdax_ipc_data -> path , devdax_provider -> path , PATH_MAX - 1 );
399
463
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,
407
471
408
472
static umf_result_t devdax_put_ipc_handle (void * provider ,
409
473
void * providerIpcData ) {
410
- if (provider == NULL || providerIpcData == NULL ) {
474
+ if (provider == NULL ) {
411
475
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
412
476
}
413
477
414
478
devdax_memory_provider_t * devdax_provider =
415
479
(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
+
416
490
devdax_ipc_data_t * devdax_ipc_data = (devdax_ipc_data_t * )providerIpcData ;
417
491
418
492
// verify the path of the /dev/dax
0 commit comments