with only one hugepage or already sorted hugepage addresses, the sort
function called memcpy with same src and dst pointer. Debugging with
valgrind will issue a warning about overlapping area. This patch changes
the bubble sort to avoid this behavior. Also, the function cannot fail
any longer.

Signed-off-by: Ralf Hoffmann <ralf.hoffmann at allegro-packets.com>
---
 lib/librte_eal/linuxapp/eal/eal_memory.c | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c 
b/lib/librte_eal/linuxapp/eal/eal_memory.c
index ac2745e..6d01f61 100644
--- a/lib/librte_eal/linuxapp/eal/eal_memory.c
+++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
@@ -699,25 +699,25 @@ error:
  * higher address first on powerpc). We use a slow algorithm, but we won't
  * have millions of pages, and this is only done at init time.
  */
-static int
+static void
 sort_by_physaddr(struct hugepage_file *hugepg_tbl, struct hugepage_info *hpi)
 {
        unsigned i, j;
-       int compare_idx;
+       unsigned compare_idx;
        uint64_t compare_addr;
        struct hugepage_file tmp;

        for (i = 0; i < hpi->num_pages[0]; i++) {
-               compare_addr = 0;
-               compare_idx = -1;
+               compare_addr = hugepg_tbl[i].physaddr;
+               compare_idx = i;

                /*
-                * browse all entries starting at 'i', and find the
+                * browse all entries starting at 'i+1', and find the
                 * entry with the smallest addr
                 */
-               for (j=i; j< hpi->num_pages[0]; j++) {
+               for (j=i + 1; j < hpi->num_pages[0]; j++) {

-                       if (compare_addr == 0 ||
+                       if (
 #ifdef RTE_ARCH_PPC_64
                                hugepg_tbl[j].physaddr > compare_addr) {
 #else
@@ -728,10 +728,9 @@ sort_by_physaddr(struct hugepage_file *hugepg_tbl, struct 
hugepage_info *hpi)
                        }
                }

-               /* should not happen */
-               if (compare_idx == -1) {
-                       RTE_LOG(ERR, EAL, "%s(): error in physaddr sorting\n", 
__func__);
-                       return -1;
+               if (compare_idx == i) {
+                       /* no smaller page found */
+                       continue;
                }

                /* swap the 2 entries in the table */
@@ -741,7 +740,8 @@ sort_by_physaddr(struct hugepage_file *hugepg_tbl, struct 
hugepage_info *hpi)
                        sizeof(struct hugepage_file));
                memcpy(&hugepg_tbl[i], &tmp, sizeof(struct hugepage_file));
        }
-       return 0;
+
+       return;
 }

 /*
@@ -1164,8 +1164,7 @@ rte_eal_hugepage_init(void)
                        goto fail;
                }

-               if (sort_by_physaddr(&tmp_hp[hp_offset], hpi) < 0)
-                       goto fail;
+               sort_by_physaddr(&tmp_hp[hp_offset], hpi);

 #ifdef RTE_EAL_SINGLE_FILE_SEGMENTS
                /* remap all hugepages into single file segments */
-- 
2.1.4

Reply via email to