Signed-off-by: Jay Rolette <rolette at infiniteio.com>
---
 lib/librte_eal/linuxapp/eal/eal_memory.c | 59 +++++++++++---------------------
 1 file changed, 20 insertions(+), 39 deletions(-)

diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c 
b/lib/librte_eal/linuxapp/eal/eal_memory.c
index bae2507..3656515 100644
--- a/lib/librte_eal/linuxapp/eal/eal_memory.c
+++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
@@ -670,6 +670,25 @@ error:
        return -1;
 }

+static int
+cmp_physaddr(const void *a, const void *b)
+{
+#ifndef RTE_ARCH_PPC_64
+       const struct hugepage_file *p1 = (const struct hugepage_file *)a;
+       const struct hugepage_file *p2 = (const struct hugepage_file *)b;
+#else
+       // PowerPC needs memory sorted in reverse order from x86
+       const struct hugepage_file *p1 = (const struct hugepage_file *)b;
+       const struct hugepage_file *p2 = (const struct hugepage_file *)a;
+#endif
+       if (p1->physaddr < p2->physaddr)
+               return -1;
+       else if (p1->physaddr > p2->physaddr)
+               return 1;
+       else
+               return 0;
+}
+
 /*
  * Sort the hugepg_tbl by physical address (lower addresses first on x86,
  * higher address first on powerpc). We use a slow algorithm, but we won't
@@ -678,45 +697,7 @@ error:
 static int
 sort_by_physaddr(struct hugepage_file *hugepg_tbl, struct hugepage_info *hpi)
 {
-       unsigned i, j;
-       int 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;
-
-               /*
-                * browse all entries starting at 'i', and find the
-                * entry with the smallest addr
-                */
-               for (j=i; j< hpi->num_pages[0]; j++) {
-
-                       if (compare_addr == 0 ||
-#ifdef RTE_ARCH_PPC_64
-                               hugepg_tbl[j].physaddr > compare_addr) {
-#else
-                               hugepg_tbl[j].physaddr < compare_addr) {
-#endif
-                               compare_addr = hugepg_tbl[j].physaddr;
-                               compare_idx = j;
-                       }
-               }
-
-               /* should not happen */
-               if (compare_idx == -1) {
-                       RTE_LOG(ERR, EAL, "%s(): error in physaddr sorting\n", 
__func__);
-                       return -1;
-               }
-
-               /* swap the 2 entries in the table */
-               memcpy(&tmp, &hugepg_tbl[compare_idx],
-                       sizeof(struct hugepage_file));
-               memcpy(&hugepg_tbl[compare_idx], &hugepg_tbl[i],
-                       sizeof(struct hugepage_file));
-               memcpy(&hugepg_tbl[i], &tmp, sizeof(struct hugepage_file));
-       }
+       qsort(hugepg_tbl, hpi->num_pages[0], sizeof(struct hugepage_file), 
cmp_physaddr);
        return 0;
 }

-- 
1.9.3 (Apple Git-50)

Reply via email to