summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAnatoly Burakov <anatoly.burakov@intel.com>2018-12-20 15:32:38 +0000
committerThomas Monjalon <thomas@monjalon.net>2018-12-20 18:09:55 +0100
commit0f526d674f8e89f6237f1521bb3aec420c9219b6 (patch)
tree6601701ee2a90b95bfb67ad2b8c3d1f60a2dafcc /lib
parent646e5260ee5371709042b0e2712822ba3ea63fe3 (diff)
malloc: separate creating memseg list and malloc heap
Currently, creating external malloc heap involves also creating a memseg list backing that malloc heap. We need to have them as separate functions, to allow creating memseg lists without creating a malloc heap. Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com> Acked-by: Yongseok Koh <yskoh@mellanox.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/librte_eal/common/malloc_heap.c34
-rw-r--r--lib/librte_eal/common/malloc_heap.h9
-rw-r--r--lib/librte_eal/common/rte_malloc.c11
3 files changed, 37 insertions, 17 deletions
diff --git a/lib/librte_eal/common/malloc_heap.c b/lib/librte_eal/common/malloc_heap.c
index 4c3632d02b..e243a8f57e 100644
--- a/lib/librte_eal/common/malloc_heap.c
+++ b/lib/librte_eal/common/malloc_heap.c
@@ -1102,9 +1102,10 @@ destroy_seg(struct malloc_elem *elem, size_t len)
return 0;
}
-int
-malloc_heap_add_external_memory(struct malloc_heap *heap, void *va_addr,
- rte_iova_t iova_addrs[], unsigned int n_pages, size_t page_sz)
+struct rte_memseg_list *
+malloc_heap_create_external_seg(void *va_addr, rte_iova_t iova_addrs[],
+ unsigned int n_pages, size_t page_sz, const char *seg_name,
+ unsigned int socket_id)
{
struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
char fbarray_name[RTE_FBARRAY_NAME_LEN];
@@ -1124,17 +1125,17 @@ malloc_heap_add_external_memory(struct malloc_heap *heap, void *va_addr,
if (msl == NULL) {
RTE_LOG(ERR, EAL, "Couldn't find empty memseg list\n");
rte_errno = ENOSPC;
- return -1;
+ return NULL;
}
snprintf(fbarray_name, sizeof(fbarray_name) - 1, "%s_%p",
- heap->name, va_addr);
+ seg_name, va_addr);
/* create the backing fbarray */
if (rte_fbarray_init(&msl->memseg_arr, fbarray_name, n_pages,
sizeof(struct rte_memseg)) < 0) {
RTE_LOG(ERR, EAL, "Couldn't create fbarray backing the memseg list\n");
- return -1;
+ return NULL;
}
arr = &msl->memseg_arr;
@@ -1150,32 +1151,39 @@ malloc_heap_add_external_memory(struct malloc_heap *heap, void *va_addr,
ms->len = page_sz;
ms->nchannel = rte_memory_get_nchannel();
ms->nrank = rte_memory_get_nrank();
- ms->socket_id = heap->socket_id;
+ ms->socket_id = socket_id;
}
/* set up the memseg list */
msl->base_va = va_addr;
msl->page_sz = page_sz;
- msl->socket_id = heap->socket_id;
+ msl->socket_id = socket_id;
msl->len = seg_len;
msl->version = 0;
msl->external = 1;
+ return msl;
+}
+
+int
+malloc_heap_add_external_memory(struct malloc_heap *heap,
+ struct rte_memseg_list *msl)
+{
/* erase contents of new memory */
- memset(va_addr, 0, seg_len);
+ memset(msl->base_va, 0, msl->len);
/* now, add newly minted memory to the malloc heap */
- malloc_heap_add_memory(heap, msl, va_addr, seg_len);
+ malloc_heap_add_memory(heap, msl, msl->base_va, msl->len);
- heap->total_size += seg_len;
+ heap->total_size += msl->len;
/* all done! */
RTE_LOG(DEBUG, EAL, "Added segment for heap %s starting at %p\n",
- heap->name, va_addr);
+ heap->name, msl->base_va);
/* notify all subscribers that a new memory area has been added */
eal_memalloc_mem_event_notify(RTE_MEM_EVENT_ALLOC,
- va_addr, seg_len);
+ msl->base_va, msl->len);
return 0;
}
diff --git a/lib/librte_eal/common/malloc_heap.h b/lib/librte_eal/common/malloc_heap.h
index e48996d527..255a315b8c 100644
--- a/lib/librte_eal/common/malloc_heap.h
+++ b/lib/librte_eal/common/malloc_heap.h
@@ -39,9 +39,14 @@ malloc_heap_create(struct malloc_heap *heap, const char *heap_name);
int
malloc_heap_destroy(struct malloc_heap *heap);
+struct rte_memseg_list *
+malloc_heap_create_external_seg(void *va_addr, rte_iova_t iova_addrs[],
+ unsigned int n_pages, size_t page_sz, const char *seg_name,
+ unsigned int socket_id);
+
int
-malloc_heap_add_external_memory(struct malloc_heap *heap, void *va_addr,
- rte_iova_t iova_addrs[], unsigned int n_pages, size_t page_sz);
+malloc_heap_add_external_memory(struct malloc_heap *heap,
+ struct rte_memseg_list *msl);
int
malloc_heap_remove_external_memory(struct malloc_heap *heap, void *va_addr,
diff --git a/lib/librte_eal/common/rte_malloc.c b/lib/librte_eal/common/rte_malloc.c
index 06cf1e666e..8a1747785e 100644
--- a/lib/librte_eal/common/rte_malloc.c
+++ b/lib/librte_eal/common/rte_malloc.c
@@ -340,6 +340,7 @@ rte_malloc_heap_memory_add(const char *heap_name, void *va_addr, size_t len,
{
struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
struct malloc_heap *heap = NULL;
+ struct rte_memseg_list *msl;
unsigned int n;
int ret;
@@ -371,9 +372,15 @@ rte_malloc_heap_memory_add(const char *heap_name, void *va_addr, size_t len,
}
n = len / page_sz;
+ msl = malloc_heap_create_external_seg(va_addr, iova_addrs, n, page_sz,
+ heap_name, heap->socket_id);
+ if (msl == NULL) {
+ ret = -1;
+ goto unlock;
+ }
+
rte_spinlock_lock(&heap->lock);
- ret = malloc_heap_add_external_memory(heap, va_addr, iova_addrs, n,
- page_sz);
+ ret = malloc_heap_add_external_memory(heap, msl);
rte_spinlock_unlock(&heap->lock);
unlock: