summaryrefslogtreecommitdiffstats
path: root/src/vnet/fib
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2017-11-29 05:20:37 -0800
committerDave Barach <openvpp@barachs.net>2017-12-13 16:07:34 +0000
commit1ec3652c25c593a7dcaae293b2f7dbed6eb15963 (patch)
tree73df6da6b53fa963cf6915e9c7d7c453d8bedfe7 /src/vnet/fib
parent8716e6bf43b7043790980c6ef0bd21d42b34a2a1 (diff)
Separate heap for IPv4 mtries
Change-Id: I497e9f6489dd35219bcf2b51ac992467aac4c8eb Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'src/vnet/fib')
-rw-r--r--src/vnet/fib/fib.c2
-rw-r--r--src/vnet/fib/ip4_fib.c42
2 files changed, 14 insertions, 30 deletions
diff --git a/src/vnet/fib/fib.c b/src/vnet/fib/fib.c
index b430e113363..413f93e893c 100644
--- a/src/vnet/fib/fib.c
+++ b/src/vnet/fib/fib.c
@@ -28,8 +28,6 @@ fib_module_init (vlib_main_t * vm)
return (error);
if ((error = vlib_call_init_function (vm, adj_module_init)))
return (error);
- if ((error = vlib_call_init_function (vm, ip4_mtrie_module_init)))
- return (error);
fib_entry_module_init();
fib_entry_src_module_init();
diff --git a/src/vnet/fib/ip4_fib.c b/src/vnet/fib/ip4_fib.c
index 45f197444e4..0f2d3f7ad89 100644
--- a/src/vnet/fib/ip4_fib.c
+++ b/src/vnet/fib/ip4_fib.c
@@ -106,11 +106,14 @@ ip4_create_fib_with_table_id (u32 table_id,
{
fib_table_t *fib_table;
ip4_fib_t *v4_fib;
+ void *old_heap;
pool_get_aligned(ip4_main.fibs, fib_table, CLIB_CACHE_LINE_BYTES);
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));
@@ -326,12 +329,17 @@ 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));
hash_set_flags (hash, HASH_FLAG_NO_AUTO_SHRINK);
+
}
hash = hash_set(hash, key, fib_entry_index);
fib->fib_entry_by_dst_address[len] = hash;
+ clib_mem_set_heap (old_heap);
}
else
{
@@ -359,7 +367,11 @@ 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;
@@ -484,36 +496,10 @@ ip4_fib_table_show_one (ip4_fib_t *fib,
u8 *
format_ip4_fib_table_memory (u8 * s, va_list * args)
{
- fib_table_t *fib_table;
- u64 total_memory;
-
- total_memory = 0;
-
- pool_foreach (fib_table, ip4_main.fibs,
- ({
- ip4_fib_t *fib;
- uword fib_size;
- int i;
-
- fib = pool_elt_at_index(ip4_main.v4_fibs, fib_table->ft_index);
- fib_size = ip4_fib_mtrie_memory_usage(&fib->mtrie);
-
- for (i = 0; i < ARRAY_LEN (fib->fib_entry_by_dst_address); i++)
- {
- uword * hash = fib->fib_entry_by_dst_address[i];
-
- if (NULL != hash)
- {
- fib_size += hash_bytes(hash);
- }
- }
-
- total_memory += fib_size;
- }));
-
s = format(s, "%=30s %=6d %=8ld\n",
"IPv4 unicast",
- pool_elts(ip4_main.fibs), total_memory);
+ pool_elts(ip4_main.fibs),
+ mheap_bytes(ip4_main.mtrie_mheap));
return (s);
}