X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip4_mtrie.c;h=97c2507463930941c22a606bac5ba60e5aed1ab9;hb=88c6e0086b15963b4d1a268e1fe8bbc2bcd9779c;hp=f114da01b77563abc8667054638c44b54a28da40;hpb=3919425550dfea28a915858588a7e9fe4094ec0a;p=vpp.git diff --git a/src/vnet/ip/ip4_mtrie.c b/src/vnet/ip/ip4_mtrie.c index f114da01b77..97c25074639 100644 --- a/src/vnet/ip/ip4_mtrie.c +++ b/src/vnet/ip/ip4_mtrie.c @@ -176,9 +176,12 @@ 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); @@ -683,8 +686,8 @@ mtrie_ply_memory_usage (ip4_fib_mtrie_t * m, ip4_fib_mtrie_8_ply_t * p) } /* Returns number of bytes of memory used by mtrie. */ -static uword -mtrie_memory_usage (ip4_fib_mtrie_t * m) +uword +ip4_fib_mtrie_memory_usage (ip4_fib_mtrie_t * m) { uword bytes, i; @@ -752,8 +755,8 @@ format_ip4_fib_mtrie_ply (u8 * s, va_list * va) { if (ip4_fib_mtrie_leaf_is_non_empty (p, i)) { - FORMAT_PLY (s, p, i, base_address, - p->dst_address_bits_base + 8, indent); + s = FORMAT_PLY (s, p, i, base_address, + p->dst_address_bits_base + 8, indent); } } @@ -771,7 +774,9 @@ format_ip4_fib_mtrie (u8 * s, va_list * va) s = format (s, "%d plies, memory usage %U\n", pool_elts (ip4_ply_pool), - format_memory_size, mtrie_memory_usage (m)); + format_memory_size, ip4_fib_mtrie_memory_usage (m)); + s = format (s, "root-ply"); + p = &m->root_ply; if (verbose) { @@ -786,7 +791,7 @@ format_ip4_fib_mtrie (u8 * s, va_list * va) if (p->dst_address_bits_of_leaves[slot] > 0) { - FORMAT_PLY (s, p, slot, base_address, 16, 2); + s = FORMAT_PLY (s, p, slot, base_address, 16, 2); } } } @@ -794,15 +799,31 @@ format_ip4_fib_mtrie (u8 * s, va_list * va) return s; } +/** Default heap size for the IPv4 mtries */ +#define IP4_FIB_DEFAULT_MTRIE_HEAP_SIZE (32<<20) + static clib_error_t * ip4_mtrie_module_init (vlib_main_t * vm) { - /* Burn one ply so index 0 is taken */ CLIB_UNUSED (ip4_fib_mtrie_8_ply_t * p); + ip4_main_t *im = &ip4_main; + clib_error_t *error = NULL; + uword *old_heap; + if (0 == im->mtrie_heap_size) + im->mtrie_heap_size = IP4_FIB_DEFAULT_MTRIE_HEAP_SIZE; +#if USE_DLMALLOC == 0 + im->mtrie_mheap = mheap_alloc (0, im->mtrie_heap_size); +#else + im->mtrie_mheap = create_mspace (im->mtrie_heap_size, 1 /* locked */ ); +#endif + + /* 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 (NULL); + return (error); } VLIB_INIT_FUNCTION (ip4_mtrie_module_init);