From 8157a161c613c3cc83c1c4507ed141b21b9627b5 Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Wed, 16 Sep 2020 17:06:45 +0200 Subject: [PATCH] ip: use main heap for mtrie Main heap can be hugepage backed so it is more efficient to use main heap instead of allocating special heap just for mtrie.... Type: improvement Change-Id: I210912ab8567c043205ddfc10fdcfde9a0fa7757 Signed-off-by: Damjan Marion --- src/vnet/fib/ip4_fib.c | 21 +++------------------ src/vnet/ip/ip4.h | 3 --- src/vnet/ip/ip4_mtrie.c | 48 ------------------------------------------------ 3 files changed, 3 insertions(+), 69 deletions(-) diff --git a/src/vnet/fib/ip4_fib.c b/src/vnet/fib/ip4_fib.c index 5b12aa67ce3..9142c636cdf 100644 --- a/src/vnet/fib/ip4_fib.c +++ b/src/vnet/fib/ip4_fib.c @@ -106,14 +106,11 @@ ip4_create_fib_with_table_id (u32 table_id, { fib_table_t *fib_table; ip4_fib_t *v4_fib; - void *old_heap; pool_get(ip4_main.fibs, fib_table); clib_memset(fib_table, 0, sizeof(*fib_table)); - old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap); pool_get_aligned(ip4_main.v4_fibs, v4_fib, CLIB_CACHE_LINE_BYTES); - clib_mem_set_heap (old_heap); ASSERT((fib_table - ip4_main.fibs) == (v4_fib - ip4_main.v4_fibs)); @@ -333,8 +330,6 @@ ip4_fib_table_entry_insert (ip4_fib_t *fib, /* * adding a new entry */ - uword *old_heap; - old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap); if (NULL == hash) { hash = hash_create (32 /* elts */, sizeof (uword)); @@ -343,7 +338,6 @@ ip4_fib_table_entry_insert (ip4_fib_t *fib, } hash = hash_set(hash, key, fib_entry_index); fib->fib_entry_by_dst_address[len] = hash; - clib_mem_set_heap (old_heap); } else { @@ -371,11 +365,7 @@ ip4_fib_table_entry_remove (ip4_fib_t *fib, } else { - uword *old_heap; - - old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap); hash_unset(hash, key); - clib_mem_set_heap (old_heap); } fib->fib_entry_by_dst_address[len] = hash; @@ -571,10 +561,9 @@ ip4_fib_table_show_one (ip4_fib_t *fib, u8 * format_ip4_fib_table_memory (u8 * s, va_list * args) { - s = format(s, "%=30s %=6d %=12ld\n", + s = format(s, "%=30s %=6d\n", "IPv4 unicast", - pool_elts(ip4_main.fibs), - mspace_footprint(ip4_main.mtrie_mheap)); + pool_elts(ip4_main.fibs)); return (s); } @@ -640,13 +629,12 @@ ip4_show_fib (vlib_main_t * vm, if (memory) { - uword mtrie_size, hash_size, *old_heap; + uword mtrie_size, hash_size; mtrie_size = ip4_fib_mtrie_memory_usage(&fib->mtrie); hash_size = 0; - old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap); for (i = 0; i < ARRAY_LEN (fib->fib_entry_by_dst_address); i++) { uword * hash = fib->fib_entry_by_dst_address[i]; @@ -655,7 +643,6 @@ ip4_show_fib (vlib_main_t * vm, hash_size += hash_bytes(hash); } } - clib_mem_set_heap (old_heap); if (verbose) vlib_cli_output (vm, "%U mtrie:%d hash:%d", @@ -725,8 +712,6 @@ ip4_show_fib (vlib_main_t * vm, total_mtrie_memory, total_hash_memory, total_mtrie_memory + total_hash_memory); - vlib_cli_output (vm, "\nMtrie Mheap Usage: %U\n", - format_mheap, ip4_main.mtrie_mheap, 1); } return 0; } diff --git a/src/vnet/ip/ip4.h b/src/vnet/ip/ip4.h index f5ed9385232..8fba33f8d6e 100644 --- a/src/vnet/ip/ip4.h +++ b/src/vnet/ip/ip4.h @@ -170,9 +170,6 @@ typedef struct ip4_main_t /** Use hugetlb pages for the Mtries */ int mtrie_hugetlb; - /** The memory heap for the mtries */ - void *mtrie_mheap; - /** ARP throttling */ throttle_t arp_throttle; diff --git a/src/vnet/ip/ip4_mtrie.c b/src/vnet/ip/ip4_mtrie.c index b5d0a890a7c..7bfcf986e6f 100644 --- a/src/vnet/ip/ip4_mtrie.c +++ b/src/vnet/ip/ip4_mtrie.c @@ -176,12 +176,9 @@ ply_create (ip4_fib_mtrie_t * m, u32 leaf_prefix_len, u32 ply_base_len) { ip4_fib_mtrie_8_ply_t *p; - void *old_heap; /* Get cache aligned ply. */ - old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap); pool_get_aligned (ip4_ply_pool, p, CLIB_CACHE_LINE_BYTES); - clib_mem_set_heap (old_heap); ply_8_init (p, init_leaf, leaf_prefix_len, ply_base_len); return ip4_fib_mtrie_leaf_set_next_ply_index (p - ip4_ply_pool); @@ -798,55 +795,10 @@ static clib_error_t * ip4_mtrie_module_init (vlib_main_t * vm) { CLIB_UNUSED (ip4_fib_mtrie_8_ply_t * p); - ip4_main_t *im = &ip4_main; clib_error_t *error = NULL; - uword *old_heap; - - if (im->mtrie_heap_size == 0) - im->mtrie_heap_size = IP4_FIB_DEFAULT_MTRIE_HEAP_SIZE; - -again: - if (im->mtrie_hugetlb) - { - void *rv; - int mmap_flags, mmap_flags_huge; - uword htlb_pagesize = clib_mem_get_default_hugepage_size (); - if (htlb_pagesize == 0) - { - clib_warning ("WARNING: htlb pagesize == 0"); - im->mtrie_hugetlb = 0; - goto again; - } - /* Round the allocation request to an even number of huge pages */ - im->mtrie_heap_size = (im->mtrie_heap_size + (htlb_pagesize - 1)) & - ~(htlb_pagesize - 1); - mmap_flags = MAP_PRIVATE | MAP_ANONYMOUS; - mmap_flags_huge = (mmap_flags | MAP_HUGETLB | MAP_LOCKED | - min_log2 (htlb_pagesize) << MAP_HUGE_SHIFT); - rv = mmap (0, im->mtrie_heap_size, - PROT_READ | PROT_WRITE, mmap_flags_huge, -1, 0); - if (rv == MAP_FAILED) - { - /* Failure when running as root should be logged... */ - if (geteuid () == 0) - clib_warning ("ip4 mtrie htlb map failed: not enough pages?"); - im->mtrie_hugetlb = 0; - goto again; - } - if (mlock (rv, im->mtrie_heap_size)) - clib_warning ("WARNING: couldn't lock mtrie heap at %llx", rv); - im->mtrie_mheap = create_mspace_with_base (rv, im->mtrie_heap_size, - 1 /* locked */ ); - } - else - { - im->mtrie_mheap = create_mspace (im->mtrie_heap_size, 1 /* locked */ ); - } /* Burn one ply so index 0 is taken */ - old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap); pool_get (ip4_ply_pool, p); - clib_mem_set_heap (old_heap); return (error); } -- 2.16.6