malloc: add option --match-allocations
[dpdk.git] / lib / librte_eal / common / malloc_elem.c
index 9d3dcb6..fcdb181 100644 (file)
@@ -110,7 +110,8 @@ malloc_elem_find_max_iova_contig(struct malloc_elem *elem, size_t align)
  */
 void
 malloc_elem_init(struct malloc_elem *elem, struct malloc_heap *heap,
-               struct rte_memseg_list *msl, size_t size)
+               struct rte_memseg_list *msl, size_t size,
+               struct malloc_elem *orig_elem, size_t orig_size)
 {
        elem->heap = heap;
        elem->msl = msl;
@@ -120,6 +121,8 @@ malloc_elem_init(struct malloc_elem *elem, struct malloc_heap *heap,
        elem->state = ELEM_FREE;
        elem->size = size;
        elem->pad = 0;
+       elem->orig_elem = orig_elem;
+       elem->orig_size = orig_size;
        set_header(elem);
        set_trailer(elem);
 }
@@ -278,7 +281,8 @@ split_elem(struct malloc_elem *elem, struct malloc_elem *split_pt)
        const size_t old_elem_size = (uintptr_t)split_pt - (uintptr_t)elem;
        const size_t new_elem_size = elem->size - old_elem_size;
 
-       malloc_elem_init(split_pt, elem->heap, elem->msl, new_elem_size);
+       malloc_elem_init(split_pt, elem->heap, elem->msl, new_elem_size,
+                        elem->orig_elem, elem->orig_size);
        split_pt->prev = elem;
        split_pt->next = next_elem;
        if (next_elem)
@@ -317,14 +321,18 @@ static int
 next_elem_is_adjacent(struct malloc_elem *elem)
 {
        return elem->next == RTE_PTR_ADD(elem, elem->size) &&
-                       elem->next->msl == elem->msl;
+                       elem->next->msl == elem->msl &&
+                       (!internal_config.match_allocations ||
+                        elem->orig_elem == elem->next->orig_elem);
 }
 
 static int
 prev_elem_is_adjacent(struct malloc_elem *elem)
 {
        return elem == RTE_PTR_ADD(elem->prev, elem->prev->size) &&
-                       elem->prev->msl == elem->msl;
+                       elem->prev->msl == elem->msl &&
+                       (!internal_config.match_allocations ||
+                        elem->orig_elem == elem->prev->orig_elem);
 }
 
 /*