eal: use memseg walk instead of iteration
authorAnatoly Burakov <anatoly.burakov@intel.com>
Wed, 11 Apr 2018 12:30:04 +0000 (13:30 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 11 Apr 2018 17:48:15 +0000 (19:48 +0200)
Reduce dependency on internal details of EAL memory subsystem, and
simplify code.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Tested-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
Tested-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Tested-by: Gowrishankar Muthukrishnan <gowrishankar.m@linux.vnet.ibm.com>
lib/librte_eal/bsdapp/eal/eal.c
lib/librte_eal/common/eal_common_memory.c
lib/librte_eal/common/malloc_heap.c
lib/librte_eal/linuxapp/eal/eal.c

index 4eafcb5..8e25d78 100644 (file)
@@ -429,23 +429,26 @@ out:
        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
index 947db1f..4f588c7 100644 (file)
@@ -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 */
index 564b61a..79914fc 100644 (file)
@@ -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;
 }
index 2ecd07b..77f6cb7 100644 (file)
@@ -638,23 +638,23 @@ out:
        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