New upstream version 16.11.3
[deb_dpdk.git] / lib / librte_eal / common / malloc_elem.c
index 27e9925..08516af 100644 (file)
@@ -275,11 +275,14 @@ malloc_elem_free(struct malloc_elem *elem)
                return -1;
 
        rte_spinlock_lock(&(elem->heap->lock));
+       size_t sz = elem->size - sizeof(*elem);
+       uint8_t *ptr = (uint8_t *)&elem[1];
        struct malloc_elem *next = RTE_PTR_ADD(elem, elem->size);
        if (next->state == ELEM_FREE){
                /* remove from free list, join to this one */
                elem_free_list_remove(next);
                join_elem(elem, next);
+               sz += sizeof(*elem);
        }
 
        /* check if previous element is free, if so join with it and return,
@@ -288,15 +291,17 @@ malloc_elem_free(struct malloc_elem *elem)
        if (elem->prev != NULL && elem->prev->state == ELEM_FREE) {
                elem_free_list_remove(elem->prev);
                join_elem(elem->prev, elem);
-               malloc_elem_free_list_insert(elem->prev);
-       }
-       /* otherwise add ourselves to the free list */
-       else {
-               malloc_elem_free_list_insert(elem);
-               elem->pad = 0;
+               sz += sizeof(*elem);
+               ptr -= sizeof(*elem);
+               elem = elem->prev;
        }
+       malloc_elem_free_list_insert(elem);
+
        /* decrease heap's count of allocated elements */
        elem->heap->alloc_count--;
+
+       memset(ptr, 0, sz);
+
        rte_spinlock_unlock(&(elem->heap->lock));
 
        return 0;
@@ -309,17 +314,16 @@ malloc_elem_free(struct malloc_elem *elem)
 int
 malloc_elem_resize(struct malloc_elem *elem, size_t size)
 {
-       const size_t new_size = size + MALLOC_ELEM_OVERHEAD;
+       const size_t new_size = size + elem->pad + MALLOC_ELEM_OVERHEAD;
        /* if we request a smaller size, then always return ok */
-       const size_t current_size = elem->size - elem->pad;
-       if (current_size >= new_size)
+       if (elem->size >= new_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;
-       if (current_size + next->size < new_size)
+       if (elem->size + next->size < new_size)
                goto err_return;
 
        /* we now know the element fits, so remove from free list,
@@ -328,7 +332,7 @@ malloc_elem_resize(struct malloc_elem *elem, size_t size)
        elem_free_list_remove(next);
        join_elem(elem, next);
 
-       if (elem->size - new_size >= MIN_DATA_SIZE + MALLOC_ELEM_OVERHEAD){
+       if (elem->size - new_size >= MIN_DATA_SIZE + MALLOC_ELEM_OVERHEAD) {
                /* now we have a big block together. Lets cut it down a bit, by splitting */
                struct malloc_elem *split_pt = RTE_PTR_ADD(elem, new_size);
                split_pt = RTE_PTR_ALIGN_CEIL(split_pt, RTE_CACHE_LINE_SIZE);