Reduce dependency on internal details of EAL memory subsystem, and
simplify code.

Signed-off-by: Anatoly Burakov <anatoly.bura...@intel.com>
Tested-by: Santosh Shukla <santosh.shu...@caviumnetworks.com>
Tested-by: Hemant Agrawal <hemant.agra...@nxp.com>
---
 lib/librte_eal/bsdapp/eal/eal.c           | 25 +++++++-----
 lib/librte_eal/common/eal_common_memory.c | 67 ++++++++++++++++---------------
 lib/librte_eal/common/malloc_heap.c       | 33 +++++++++------
 lib/librte_eal/linuxapp/eal/eal.c         | 22 +++++-----
 4 files changed, 81 insertions(+), 66 deletions(-)

diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
index 4eafcb5..8e25d78 100644
--- a/lib/librte_eal/bsdapp/eal/eal.c
+++ b/lib/librte_eal/bsdapp/eal/eal.c
@@ -429,23 +429,26 @@ eal_parse_args(int argc, char **argv)
        return ret;
 }
 
+static int
+check_socket(const struct rte_memseg *ms, void *arg)
+{
+       int *socket_id = arg;
+
+       if (ms->socket_id == *socket_id)
+               return 1;
+
+       return 0;
+}
+
 static void
 eal_check_mem_on_local_socket(void)
 {
-       const struct rte_memseg *ms;
-       int i, socket_id;
+       int socket_id;
 
        socket_id = rte_lcore_to_socket_id(rte_config.master_lcore);
 
-       ms = rte_eal_get_physmem_layout();
-
-       for (i = 0; i < RTE_MAX_MEMSEG; i++)
-               if (ms[i].socket_id == socket_id &&
-                               ms[i].len > 0)
-                       return;
-
-       RTE_LOG(WARNING, EAL, "WARNING: Master core has no "
-                       "memory on local socket!\n");
+       if (rte_memseg_walk(check_socket, &socket_id) == 0)
+               RTE_LOG(WARNING, EAL, "WARNING: Master core has no memory on 
local socket!\n");
 }
 
 static int
diff --git a/lib/librte_eal/common/eal_common_memory.c 
b/lib/librte_eal/common/eal_common_memory.c
index 947db1f..4f588c7 100644
--- a/lib/librte_eal/common/eal_common_memory.c
+++ b/lib/librte_eal/common/eal_common_memory.c
@@ -131,54 +131,57 @@ rte_eal_get_physmem_layout(void)
        return rte_eal_get_configuration()->mem_config->memseg;
 }
 
+static int
+physmem_size(const struct rte_memseg *ms, void *arg)
+{
+       uint64_t *total_len = arg;
+
+       *total_len += ms->len;
+
+       return 0;
+}
 
 /* get the total size of memory */
 uint64_t
 rte_eal_get_physmem_size(void)
 {
-       const struct rte_mem_config *mcfg;
-       unsigned i = 0;
        uint64_t total_len = 0;
 
-       /* get pointer to global configuration */
-       mcfg = rte_eal_get_configuration()->mem_config;
+       rte_memseg_walk(physmem_size, &total_len);
 
-       for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-               if (mcfg->memseg[i].addr == NULL)
-                       break;
+       return total_len;
+}
 
-               total_len += mcfg->memseg[i].len;
-       }
+static int
+dump_memseg(const struct rte_memseg *ms, void *arg)
+{
+       struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
+       int i = ms - mcfg->memseg;
+       FILE *f = arg;
 
-       return total_len;
+       if (i < 0 || i >= RTE_MAX_MEMSEG)
+               return -1;
+
+       fprintf(f, "Segment %u: IOVA:0x%"PRIx64", len:%zu, "
+                       "virt:%p, socket_id:%"PRId32", "
+                       "hugepage_sz:%"PRIu64", nchannel:%"PRIx32", "
+                       "nrank:%"PRIx32"\n", i,
+                       mcfg->memseg[i].iova,
+                       mcfg->memseg[i].len,
+                       mcfg->memseg[i].addr,
+                       mcfg->memseg[i].socket_id,
+                       mcfg->memseg[i].hugepage_sz,
+                       mcfg->memseg[i].nchannel,
+                       mcfg->memseg[i].nrank);
+
+       return 0;
 }
 
 /* Dump the physical memory layout on console */
 void
 rte_dump_physmem_layout(FILE *f)
 {
-       const struct rte_mem_config *mcfg;
-       unsigned i = 0;
-
-       /* get pointer to global configuration */
-       mcfg = rte_eal_get_configuration()->mem_config;
-
-       for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-               if (mcfg->memseg[i].addr == NULL)
-                       break;
-
-               fprintf(f, "Segment %u: IOVA:0x%"PRIx64", len:%zu, "
-                      "virt:%p, socket_id:%"PRId32", "
-                      "hugepage_sz:%"PRIu64", nchannel:%"PRIx32", "
-                      "nrank:%"PRIx32"\n", i,
-                      mcfg->memseg[i].iova,
-                      mcfg->memseg[i].len,
-                      mcfg->memseg[i].addr,
-                      mcfg->memseg[i].socket_id,
-                      mcfg->memseg[i].hugepage_sz,
-                      mcfg->memseg[i].nchannel,
-                      mcfg->memseg[i].nrank);
-       }
+       rte_memseg_walk(dump_memseg, f);
 }
 
 /* return the number of memory channels */
diff --git a/lib/librte_eal/common/malloc_heap.c 
b/lib/librte_eal/common/malloc_heap.c
index 564b61a..79914fc 100644
--- a/lib/librte_eal/common/malloc_heap.c
+++ b/lib/librte_eal/common/malloc_heap.c
@@ -67,17 +67,32 @@ check_hugepage_sz(unsigned flags, uint64_t hugepage_sz)
  * to prevent overflow. The rest of the zone is added to free list as a single
  * large free block
  */
-static void
-malloc_heap_add_memseg(struct malloc_heap *heap, struct rte_memseg *ms)
+static int
+malloc_heap_add_memseg(const struct rte_memseg *ms, void *arg __rte_unused)
 {
-       struct malloc_elem *start_elem = (struct malloc_elem *)ms->addr;
-       const size_t elem_size = ms->len - MALLOC_ELEM_OVERHEAD;
+       struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
+       struct malloc_elem *start_elem;
+       struct rte_memseg *found_ms;
+       struct malloc_heap *heap;
+       size_t elem_size;
+       int ms_idx;
+
+       heap = &mcfg->malloc_heaps[ms->socket_id];
+
+       /* ms is const, so find it */
+       ms_idx = ms - mcfg->memseg;
+       found_ms = &mcfg->memseg[ms_idx];
 
-       malloc_elem_init(start_elem, heap, ms, elem_size);
+       start_elem = (struct malloc_elem *)found_ms->addr;
+       elem_size = ms->len - MALLOC_ELEM_OVERHEAD;
+
+       malloc_elem_init(start_elem, heap, found_ms, elem_size);
        malloc_elem_insert(start_elem);
        malloc_elem_free_list_insert(start_elem);
 
        heap->total_size += elem_size;
+
+       return 0;
 }
 
 /*
@@ -244,17 +259,11 @@ int
 rte_eal_malloc_heap_init(void)
 {
        struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
-       unsigned ms_cnt;
-       struct rte_memseg *ms;
 
        if (mcfg == NULL)
                return -1;
 
-       for (ms = &mcfg->memseg[0], ms_cnt = 0;
-                       (ms_cnt < RTE_MAX_MEMSEG) && (ms->len > 0);
-                       ms_cnt++, ms++) {
-               malloc_heap_add_memseg(&mcfg->malloc_heaps[ms->socket_id], ms);
-       }
+       rte_memseg_walk(malloc_heap_add_memseg, NULL);
 
        return 0;
 }
diff --git a/lib/librte_eal/linuxapp/eal/eal.c 
b/lib/librte_eal/linuxapp/eal/eal.c
index 2ecd07b..77f6cb7 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -638,23 +638,23 @@ eal_parse_args(int argc, char **argv)
        return ret;
 }
 
+static int
+check_mem(const struct rte_memseg *ms, void *arg)
+{
+       int *socket = arg;
+
+       return ms->socket_id == *socket;
+}
+
 static void
 eal_check_mem_on_local_socket(void)
 {
-       const struct rte_memseg *ms;
-       int i, socket_id;
+       int socket_id;
 
        socket_id = rte_lcore_to_socket_id(rte_config.master_lcore);
 
-       ms = rte_eal_get_physmem_layout();
-
-       for (i = 0; i < RTE_MAX_MEMSEG; i++)
-               if (ms[i].socket_id == socket_id &&
-                               ms[i].len > 0)
-                       return;
-
-       RTE_LOG(WARNING, EAL, "WARNING: Master core has no "
-                       "memory on local socket!\n");
+       if (rte_memseg_walk(check_mem, &socket_id) == 0)
+               RTE_LOG(WARNING, EAL, "WARNING: Master core has no memory on 
local socket!\n");
 }
 
 static int
-- 
2.7.4

Reply via email to