version: 18.05-rc6
[dpdk.git] / lib / librte_eal / common / malloc_elem.c
index 9db416f..9bfe9b9 100644 (file)
@@ -22,8 +22,6 @@
 #include "malloc_elem.h"
 #include "malloc_heap.h"
 
-#define MIN_DATA_SIZE (RTE_CACHE_LINE_SIZE)
-
 /*
  * Initialize a general malloc_elem header structure
  */
@@ -49,6 +47,12 @@ malloc_elem_insert(struct malloc_elem *elem)
        struct malloc_elem *prev_elem, *next_elem;
        struct malloc_heap *heap = elem->heap;
 
+       /* first and last elements must be both NULL or both non-NULL */
+       if ((heap->first == NULL) != (heap->last == NULL)) {
+               RTE_LOG(ERR, EAL, "Heap is probably corrupt\n");
+               return;
+       }
+
        if (heap->first == NULL && heap->last == NULL) {
                /* if empty heap */
                heap->first = elem;
@@ -439,6 +443,8 @@ malloc_elem_free(struct malloc_elem *elem)
 
        malloc_elem_free_list_insert(elem);
 
+       elem->pad = 0;
+
        /* decrease heap's count of allocated elements */
        elem->heap->alloc_count--;
 
@@ -447,6 +453,53 @@ malloc_elem_free(struct malloc_elem *elem)
        return elem;
 }
 
+/* assume all checks were already done */
+void
+malloc_elem_hide_region(struct malloc_elem *elem, void *start, size_t len)
+{
+       struct malloc_elem *hide_start, *hide_end, *prev, *next;
+       size_t len_before, len_after;
+
+       hide_start = start;
+       hide_end = RTE_PTR_ADD(start, len);
+
+       prev = elem->prev;
+       next = elem->next;
+
+       /* we cannot do anything with non-adjacent elements */
+       if (next && next_elem_is_adjacent(elem)) {
+               len_after = RTE_PTR_DIFF(next, hide_end);
+               if (len_after >= MALLOC_ELEM_OVERHEAD + MIN_DATA_SIZE) {
+                       /* split after */
+                       split_elem(elem, hide_end);
+
+                       malloc_elem_free_list_insert(hide_end);
+               } else if (len_after > 0) {
+                       RTE_LOG(ERR, EAL, "Unaligned element, heap is probably corrupt\n");
+                       return;
+               }
+       }
+
+       /* we cannot do anything with non-adjacent elements */
+       if (prev && prev_elem_is_adjacent(elem)) {
+               len_before = RTE_PTR_DIFF(hide_start, elem);
+               if (len_before >= MALLOC_ELEM_OVERHEAD + MIN_DATA_SIZE) {
+                       /* split before */
+                       split_elem(elem, hide_start);
+
+                       prev = elem;
+                       elem = hide_start;
+
+                       malloc_elem_free_list_insert(prev);
+               } else if (len_before > 0) {
+                       RTE_LOG(ERR, EAL, "Unaligned element, heap is probably corrupt\n");
+                       return;
+               }
+       }
+
+       remove_elem(elem);
+}
+
 /*
  * attempt to resize a malloc_elem by expanding into any free space
  * immediately after it in memory.