Skip to content

Commit 64bf958

Browse files
committed
Add IPC-consumer-only mode to devdax provider
Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
1 parent 7b2a4ba commit 64bf958

File tree

1 file changed

+98
-24
lines changed

1 file changed

+98
-24
lines changed

src/provider/provider_devdax_memory.c

Lines changed: 98 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
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

3839
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
4547
} devdax_memory_provider_t;
4648

4749
typedef 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

325347
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) {
327361
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
328362
}
329363

@@ -345,17 +379,38 @@ static const char *devdax_get_name(void *provider) {
345379
static 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

356401
static 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

388443
static 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

408472
static 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

Comments
 (0)