malloc: make heap a doubly-linked list
[dpdk.git] / lib / librte_eal / common / malloc_heap.c
index 7aafc88..9c95166 100644 (file)
@@ -70,15 +70,11 @@ check_hugepage_sz(unsigned flags, uint64_t hugepage_sz)
 static void
 malloc_heap_add_memseg(struct malloc_heap *heap, struct rte_memseg *ms)
 {
-       /* allocate the memory block headers, one at end, one at start */
        struct malloc_elem *start_elem = (struct malloc_elem *)ms->addr;
-       struct malloc_elem *end_elem = RTE_PTR_ADD(ms->addr,
-                       ms->len - MALLOC_ELEM_OVERHEAD);
-       end_elem = RTE_PTR_ALIGN_FLOOR(end_elem, RTE_CACHE_LINE_SIZE);
-       const size_t elem_size = (uintptr_t)end_elem - (uintptr_t)start_elem;
+       const size_t elem_size = ms->len - MALLOC_ELEM_OVERHEAD;
 
        malloc_elem_init(start_elem, heap, ms, elem_size);
-       malloc_elem_mkend(end_elem, start_elem);
+       malloc_elem_insert(start_elem);
        malloc_elem_free_list_insert(start_elem);
 
        heap->total_size += elem_size;
@@ -145,6 +141,44 @@ malloc_heap_alloc(struct malloc_heap *heap,
        return elem == NULL ? NULL : (void *)(&elem[1]);
 }
 
+int
+malloc_heap_free(struct malloc_elem *elem)
+{
+       struct malloc_heap *heap;
+       int ret;
+
+       if (!malloc_elem_cookies_ok(elem) || elem->state != ELEM_BUSY)
+               return -1;
+
+       /* elem may be merged with previous element, so keep heap address */
+       heap = elem->heap;
+
+       rte_spinlock_lock(&(heap->lock));
+
+       ret = malloc_elem_free(elem);
+
+       rte_spinlock_unlock(&(heap->lock));
+
+       return ret;
+}
+
+int
+malloc_heap_resize(struct malloc_elem *elem, size_t size)
+{
+       int ret;
+
+       if (!malloc_elem_cookies_ok(elem) || elem->state != ELEM_BUSY)
+               return -1;
+
+       rte_spinlock_lock(&(elem->heap->lock));
+
+       ret = malloc_elem_resize(elem, size);
+
+       rte_spinlock_unlock(&(elem->heap->lock));
+
+       return ret;
+}
+
 /*
  * Function to retrieve data for heap on given socket
  */