eal: use memseg walk instead of iteration
[dpdk.git] / lib / librte_eal / common / malloc_heap.c
index a2c2e4c..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;
 }
 
 /*
@@ -88,7 +103,7 @@ malloc_heap_add_memseg(struct malloc_heap *heap, struct rte_memseg *ms)
  */
 static struct malloc_elem *
 find_suitable_element(struct malloc_heap *heap, size_t size,
-               unsigned flags, size_t align, size_t bound)
+               unsigned int flags, size_t align, size_t bound, bool contig)
 {
        size_t idx;
        struct malloc_elem *elem, *alt_elem = NULL;
@@ -97,7 +112,8 @@ find_suitable_element(struct malloc_heap *heap, size_t size,
                        idx < RTE_HEAP_NUM_FREELISTS; idx++) {
                for (elem = LIST_FIRST(&heap->free_head[idx]);
                                !!elem; elem = LIST_NEXT(elem, free_list)) {
-                       if (malloc_elem_can_hold(elem, size, align, bound)) {
+                       if (malloc_elem_can_hold(elem, size, align, bound,
+                                       contig)) {
                                if (check_hugepage_sz(flags, elem->ms->hugepage_sz))
                                        return elem;
                                if (alt_elem == NULL)
@@ -121,7 +137,7 @@ find_suitable_element(struct malloc_heap *heap, size_t size,
 void *
 malloc_heap_alloc(struct malloc_heap *heap,
                const char *type __attribute__((unused)), size_t size, unsigned flags,
-               size_t align, size_t bound)
+               size_t align, size_t bound, bool contig)
 {
        struct malloc_elem *elem;
 
@@ -130,9 +146,9 @@ malloc_heap_alloc(struct malloc_heap *heap,
 
        rte_spinlock_lock(&heap->lock);
 
-       elem = find_suitable_element(heap, size, flags, align, bound);
+       elem = find_suitable_element(heap, size, flags, align, bound, contig);
        if (elem != NULL) {
-               elem = malloc_elem_alloc(elem, size, align, bound);
+               elem = malloc_elem_alloc(elem, size, align, bound, contig);
                /* increase heap's count of allocated elements */
                heap->alloc_count++;
        }
@@ -243,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;
 }