From: xuemingl <xuemi...@mellanox.com>

DPDK uses it's own memory management, few regular memory profiler tool
support DPDK now. Malloc cookie check provides limited memory corruption
check, better than nothing. This patch fixes the following:
1. Replace broken generated configuration macro RTE_LIBRTE_MALLOC_DEBUG
with RTE_MALLOC_DEBUG
2. Fix malloc size calculation when RTE_MALLOC_DEBUG cookie check
enabled.

>From real test, it IS very helpful to detect memory corruption.

A better designed DPDK application should quit nicely with resoure
releasing so that all allocated memory could be checked against cookie.

Fixes: af75078 ("first public release")
Cc: Sergio Gonzalez Monroy <sergio.gonzalez.mon...@intel.com>

Signed-off-by: Xueming Li <xuemi...@mellanox.com>
---
 lib/librte_eal/common/malloc_elem.c |  8 ++++----
 lib/librte_eal/common/malloc_elem.h |  4 ++--
 test/test/test_malloc.c             | 10 +++++-----
 3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/lib/librte_eal/common/malloc_elem.c 
b/lib/librte_eal/common/malloc_elem.c
index 150769057..889dffd21 100644
--- a/lib/librte_eal/common/malloc_elem.c
+++ b/lib/librte_eal/common/malloc_elem.c
@@ -275,14 +275,14 @@ malloc_elem_free(struct malloc_elem *elem)
                return -1;
 
        rte_spinlock_lock(&(elem->heap->lock));
-       size_t sz = elem->size - sizeof(*elem);
+       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);
        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);
+               sz += (sizeof(*elem) + MALLOC_ELEM_TRAILER_LEN);
        }
 
        /* check if previous element is free, if so join with it and return,
@@ -291,8 +291,8 @@ 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);
-               sz += sizeof(*elem);
-               ptr -= sizeof(*elem);
+               sz += (sizeof(*elem) + MALLOC_ELEM_TRAILER_LEN);
+               ptr -= (sizeof(*elem) + MALLOC_ELEM_TRAILER_LEN);
                elem = elem->prev;
        }
        malloc_elem_free_list_insert(elem);
diff --git a/lib/librte_eal/common/malloc_elem.h 
b/lib/librte_eal/common/malloc_elem.h
index f04b2d1e4..ce39129d9 100644
--- a/lib/librte_eal/common/malloc_elem.h
+++ b/lib/librte_eal/common/malloc_elem.h
@@ -53,13 +53,13 @@ struct malloc_elem {
        volatile enum elem_state state;
        uint32_t pad;
        size_t size;
-#ifdef RTE_LIBRTE_MALLOC_DEBUG
+#ifdef RTE_MALLOC_DEBUG
        uint64_t header_cookie;         /* Cookie marking start of data */
                                        /* trailer cookie at start + size */
 #endif
 } __rte_cache_aligned;
 
-#ifndef RTE_LIBRTE_MALLOC_DEBUG
+#ifndef RTE_MALLOC_DEBUG
 static const unsigned MALLOC_ELEM_TRAILER_LEN = 0;
 
 /* dummy function - just check if pointer is non-null */
diff --git a/test/test/test_malloc.c b/test/test/test_malloc.c
index 013fd4407..5558acda4 100644
--- a/test/test/test_malloc.c
+++ b/test/test/test_malloc.c
@@ -108,7 +108,7 @@ test_align_overlap_per_lcore(__attribute__((unused)) void 
*arg)
                }
                for(j = 0; j < 1000 ; j++) {
                        if( *(char *)p1 != 0) {
-                               printf("rte_zmalloc didn't zero"
+                               printf("rte_zmalloc didn't zero "
                                       "the allocated memory\n");
                                ret = -1;
                        }
@@ -180,7 +180,7 @@ test_reordered_free_per_lcore(__attribute__((unused)) void 
*arg)
                }
                for(j = 0; j < 1000 ; j++) {
                        if( *(char *)p1 != 0) {
-                               printf("rte_zmalloc didn't zero"
+                               printf("rte_zmalloc didn't zero "
                                       "the allocated memory\n");
                                ret = -1;
                        }
@@ -293,7 +293,7 @@ test_multi_alloc_statistics(void)
        struct rte_malloc_socket_stats pre_stats, post_stats ,first_stats, 
second_stats;
        size_t size = 2048;
        int align = 1024;
-#ifndef RTE_LIBRTE_MALLOC_DEBUG
+#ifndef RTE_MALLOC_DEBUG
        int trailer_size = 0;
 #else
        int trailer_size = RTE_CACHE_LINE_SIZE;
@@ -623,7 +623,7 @@ test_rte_malloc_validate(void)
        const size_t request_size = 1024;
        size_t allocated_size;
        char *data_ptr = rte_malloc(NULL, request_size, RTE_CACHE_LINE_SIZE);
-#ifdef RTE_LIBRTE_MALLOC_DEBUG
+#ifdef RTE_MALLOC_DEBUG
        int retval;
        char *over_write_vals = NULL;
 #endif
@@ -645,7 +645,7 @@ test_rte_malloc_validate(void)
        if (allocated_size < request_size)
                err_return();
 
-#ifdef RTE_LIBRTE_MALLOC_DEBUG
+#ifdef RTE_MALLOC_DEBUG
 
        /****** change the header to be bad */
        char save_buf[64];
-- 
2.13.3

Reply via email to