[dpdk-dev] [PATCH v3 15/20] malloc: allow detaching from external memory
Anatoly Burakov
anatoly.burakov at intel.com
Thu Sep 20 13:36:28 CEST 2018
Add API to detach from existing chunk of external memory in a
process.
Signed-off-by: Anatoly Burakov <anatoly.burakov at intel.com>
---
lib/librte_eal/common/include/rte_malloc.h | 27 ++++++++++++++++++++++
lib/librte_eal/common/rte_malloc.c | 27 ++++++++++++++++++----
lib/librte_eal/rte_eal_version.map | 1 +
3 files changed, 50 insertions(+), 5 deletions(-)
diff --git a/lib/librte_eal/common/include/rte_malloc.h b/lib/librte_eal/common/include/rte_malloc.h
index 440496cd9..d2236c421 100644
--- a/lib/librte_eal/common/include/rte_malloc.h
+++ b/lib/librte_eal/common/include/rte_malloc.h
@@ -315,6 +315,9 @@ rte_malloc_heap_memory_add(const char *heap_name, void *va_addr, size_t len,
* @note Memory area must not contain any allocated elements to allow its
* removal from the heap
*
+ * @note All other processes must detach from the memory chunk prior to it being
+ * removed from the heap.
+ *
* @param heap_name
* Name of the heap to remove memory from
* @param va_addr
@@ -357,6 +360,30 @@ rte_malloc_heap_memory_remove(const char *heap_name, void *va_addr, size_t len);
int __rte_experimental
rte_malloc_heap_memory_attach(const char *heap_name, void *va_addr, size_t len);
+/**
+ * Detach from a chunk of external memory in secondary process.
+ *
+ * @note This function must be called in before any attempt is made to remove
+ * external memory from the heap in another process. This function does *not*
+ * need to be called if a call to ``rte_malloc_heap_memory_remove`` will be
+ * called in current process.
+ *
+ * @param heap_name
+ * Heap name to which this chunk of memory belongs
+ * @param va_addr
+ * Start address of memory chunk to attach to
+ * @param len
+ * Length of memory chunk to attach to
+ * @return
+ * 0 on successful detach
+ * -1 on unsuccessful detach, with rte_errno set to indicate cause for error:
+ * EINVAL - one of the parameters was invalid
+ * EPERM - attempted to detach memory from a reserved heap
+ * ENOENT - heap or memory chunk was not found
+ */
+int __rte_experimental
+rte_malloc_heap_memory_detach(const char *heap_name, void *va_addr, size_t len);
+
/**
* Creates a new empty malloc heap with a specified name.
*
diff --git a/lib/librte_eal/common/rte_malloc.c b/lib/librte_eal/common/rte_malloc.c
index bc22d21e4..e9be179d5 100644
--- a/lib/librte_eal/common/rte_malloc.c
+++ b/lib/librte_eal/common/rte_malloc.c
@@ -397,10 +397,11 @@ struct sync_mem_walk_arg {
void *va_addr;
size_t len;
int result;
+ bool attach;
};
static int
-attach_mem_walk(const struct rte_memseg_list *msl, void *arg)
+sync_mem_walk(const struct rte_memseg_list *msl, void *arg)
{
struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
struct sync_mem_walk_arg *wa = arg;
@@ -415,7 +416,10 @@ attach_mem_walk(const struct rte_memseg_list *msl, void *arg)
msl_idx = msl - mcfg->memsegs;
found_msl = &mcfg->memsegs[msl_idx];
- ret = rte_fbarray_attach(&found_msl->memseg_arr);
+ if (wa->attach)
+ ret = rte_fbarray_attach(&found_msl->memseg_arr);
+ else
+ ret = rte_fbarray_detach(&found_msl->memseg_arr);
if (ret < 0)
wa->result = -rte_errno;
@@ -426,8 +430,8 @@ attach_mem_walk(const struct rte_memseg_list *msl, void *arg)
return 0;
}
-int
-rte_malloc_heap_memory_attach(const char *heap_name, void *va_addr, size_t len)
+static int
+sync_memory(const char *heap_name, void *va_addr, size_t len, bool attach)
{
struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
struct malloc_heap *heap = NULL;
@@ -461,9 +465,10 @@ rte_malloc_heap_memory_attach(const char *heap_name, void *va_addr, size_t len)
wa.va_addr = va_addr;
wa.len = len;
wa.result = -ENOENT; /* fail unless explicitly told to succeed */
+ wa.attach = attach;
/* we're already holding a read lock */
- rte_memseg_list_walk_thread_unsafe(attach_mem_walk, &wa);
+ rte_memseg_list_walk_thread_unsafe(sync_mem_walk, &wa);
if (wa.result < 0) {
rte_errno = -wa.result;
@@ -476,6 +481,18 @@ rte_malloc_heap_memory_attach(const char *heap_name, void *va_addr, size_t len)
return ret;
}
+int
+rte_malloc_heap_memory_attach(const char *heap_name, void *va_addr, size_t len)
+{
+ return sync_memory(heap_name, va_addr, len, true);
+}
+
+int
+rte_malloc_heap_memory_detach(const char *heap_name, void *va_addr, size_t len)
+{
+ return sync_memory(heap_name, va_addr, len, false);
+}
+
int
rte_malloc_heap_create(const char *heap_name)
{
diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
index 0a2e46767..a535c4da8 100644
--- a/lib/librte_eal/rte_eal_version.map
+++ b/lib/librte_eal/rte_eal_version.map
@@ -323,6 +323,7 @@ EXPERIMENTAL {
rte_malloc_heap_get_socket;
rte_malloc_heap_memory_add;
rte_malloc_heap_memory_attach;
+ rte_malloc_heap_memory_detach;
rte_malloc_heap_memory_remove;
rte_mem_alloc_validator_register;
rte_mem_alloc_validator_unregister;
--
2.17.1
More information about the dev
mailing list