malloc: move all locking to heap
authorAnatoly Burakov <anatoly.burakov@intel.com>
Wed, 11 Apr 2018 12:29:37 +0000 (13:29 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 11 Apr 2018 17:37:39 +0000 (19:37 +0200)
Down the line, we will need to do everything from the heap as any
alloc or free may trigger alloc/free OS memory, which would involve
growing/shrinking heap.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Tested-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
Tested-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Tested-by: Gowrishankar Muthukrishnan <gowrishankar.m@linux.vnet.ibm.com>
lib/librte_eal/common/malloc_elem.c
lib/librte_eal/common/malloc_heap.c
lib/librte_eal/common/malloc_heap.h
lib/librte_eal/common/rte_malloc.c

index 0cadc8a..ea041e2 100644 (file)
@@ -243,10 +243,6 @@ join_elem(struct malloc_elem *elem1, struct malloc_elem *elem2)
 int
 malloc_elem_free(struct malloc_elem *elem)
 {
-       if (!malloc_elem_cookies_ok(elem) || elem->state != ELEM_BUSY)
-               return -1;
-
-       rte_spinlock_lock(&(elem->heap->lock));
        size_t sz = elem->size - sizeof(*elem) - MALLOC_ELEM_TRAILER_LEN;
        uint8_t *ptr = (uint8_t *)&elem[1];
        struct malloc_elem *next = RTE_PTR_ADD(elem, elem->size);
@@ -274,8 +270,6 @@ malloc_elem_free(struct malloc_elem *elem)
 
        memset(ptr, 0, sz);
 
-       rte_spinlock_unlock(&(elem->heap->lock));
-
        return 0;
 }
 
@@ -292,11 +286,10 @@ malloc_elem_resize(struct malloc_elem *elem, size_t size)
                return 0;
 
        struct malloc_elem *next = RTE_PTR_ADD(elem, elem->size);
-       rte_spinlock_lock(&elem->heap->lock);
        if (next ->state != ELEM_FREE)
-               goto err_return;
+               return -1;
        if (elem->size + next->size < new_size)
-               goto err_return;
+               return -1;
 
        /* we now know the element fits, so remove from free list,
         * join the two
@@ -311,10 +304,5 @@ malloc_elem_resize(struct malloc_elem *elem, size_t size)
                split_elem(elem, split_pt);
                malloc_elem_free_list_insert(split_pt);
        }
-       rte_spinlock_unlock(&elem->heap->lock);
        return 0;
-
-err_return:
-       rte_spinlock_unlock(&elem->heap->lock);
-       return -1;
 }
index 7aafc88..7d8d70a 100644 (file)
@@ -145,6 +145,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
  */
index e0defa7..ab0005c 100644 (file)
@@ -27,6 +27,12 @@ void *
 malloc_heap_alloc(struct malloc_heap *heap,    const char *type, size_t size,
                unsigned flags, size_t align, size_t bound);
 
+int
+malloc_heap_free(struct malloc_elem *elem);
+
+int
+malloc_heap_resize(struct malloc_elem *elem, size_t size);
+
 int
 malloc_heap_get_stats(struct malloc_heap *heap,
                struct rte_malloc_socket_stats *socket_stats);
index e0e0d0b..970813e 100644 (file)
@@ -29,7 +29,7 @@
 void rte_free(void *addr)
 {
        if (addr == NULL) return;
-       if (malloc_elem_free(malloc_elem_from_data(addr)) < 0)
+       if (malloc_heap_free(malloc_elem_from_data(addr)) < 0)
                rte_panic("Fatal error: Invalid memory\n");
 }
 
@@ -140,7 +140,7 @@ rte_realloc(void *ptr, size_t size, unsigned align)
        size = RTE_CACHE_LINE_ROUNDUP(size), align = RTE_CACHE_LINE_ROUNDUP(align);
        /* check alignment matches first, and if ok, see if we can resize block */
        if (RTE_PTR_ALIGN(ptr,align) == ptr &&
-                       malloc_elem_resize(elem, size) == 0)
+                       malloc_heap_resize(elem, size) == 0)
                return ptr;
 
        /* either alignment is off, or we have no room to expand,