Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
vppinfra: remove the historical mheap memory allocator
[vpp.git]
/
src
/
vnet
/
ip
/
ip4_mtrie.c
diff --git
a/src/vnet/ip/ip4_mtrie.c
b/src/vnet/ip/ip4_mtrie.c
old mode 100644
(file)
new mode 100755
(executable)
index
97c2507
..
258a0f7
--- a/
src/vnet/ip/ip4_mtrie.c
+++ b/
src/vnet/ip/ip4_mtrie.c
@@
-146,7
+146,7
@@
ip4_fib_mtrie_leaf_set_next_ply_index (u32 i)
*/ \
p->n_non_empty_leafs = (prefix_len > ply_base_len ? \
ARRAY_LEN (p->leaves) : 0); \
*/ \
p->n_non_empty_leafs = (prefix_len > ply_base_len ? \
ARRAY_LEN (p->leaves) : 0); \
- memset (p->dst_address_bits_of_leaves, prefix_len, \
+
clib_
memset (p->dst_address_bits_of_leaves, prefix_len, \
sizeof (p->dst_address_bits_of_leaves)); \
p->dst_address_bits_base = ply_base_len; \
\
sizeof (p->dst_address_bits_of_leaves)); \
p->dst_address_bits_base = ply_base_len; \
\
@@
-165,8
+165,8
@@
static void
ply_16_init (ip4_fib_mtrie_16_ply_t * p,
ip4_fib_mtrie_leaf_t init, uword prefix_len)
{
ply_16_init (ip4_fib_mtrie_16_ply_t * p,
ip4_fib_mtrie_leaf_t init, uword prefix_len)
{
- memset (p->dst_address_bits_of_leaves, prefix_len,
- sizeof (p->dst_address_bits_of_leaves));
+
clib_
memset (p->dst_address_bits_of_leaves, prefix_len,
+
sizeof (p->dst_address_bits_of_leaves));
PLY_INIT_LEAVES (p);
}
PLY_INIT_LEAVES (p);
}
@@
-198,7
+198,7
@@
get_next_ply_for_leaf (ip4_fib_mtrie_t * m, ip4_fib_mtrie_leaf_t l)
void
ip4_mtrie_free (ip4_fib_mtrie_t * m)
{
void
ip4_mtrie_free (ip4_fib_mtrie_t * m)
{
- /* the root ply is embedded so the is nothing to do,
+ /* the root ply is embedded so the
re
is nothing to do,
* the assumption being that the IP4 FIB table has emptied the trie
* before deletion.
*/
* the assumption being that the IP4 FIB table has emptied the trie
* before deletion.
*/
@@
-254,8
+254,7
@@
set_ply_with_more_specific_leaf (ip4_fib_mtrie_t * m,
else if (new_leaf_dst_address_bits >=
ply->dst_address_bits_of_leaves[i])
{
else if (new_leaf_dst_address_bits >=
ply->dst_address_bits_of_leaves[i])
{
- __sync_val_compare_and_swap (&ply->leaves[i], old_leaf, new_leaf);
- ASSERT (ply->leaves[i] == new_leaf);
+ clib_atomic_store_rel_n (&ply->leaves[i], new_leaf);
ply->dst_address_bits_of_leaves[i] = new_leaf_dst_address_bits;
ply->n_non_empty_leafs += ip4_fib_mtrie_leaf_is_non_empty (ply, i);
}
ply->dst_address_bits_of_leaves[i] = new_leaf_dst_address_bits;
ply->n_non_empty_leafs += ip4_fib_mtrie_leaf_is_non_empty (ply, i);
}
@@
-319,9
+318,7
@@
set_leaf (ip4_fib_mtrie_t * m,
old_ply->dst_address_bits_of_leaves[i] =
a->dst_address_length;
old_ply->dst_address_bits_of_leaves[i] =
a->dst_address_length;
- __sync_val_compare_and_swap (&old_ply->leaves[i], old_leaf,
- new_leaf);
- ASSERT (old_ply->leaves[i] == new_leaf);
+ clib_atomic_store_rel_n (&old_ply->leaves[i], new_leaf);
old_ply->n_non_empty_leafs +=
ip4_fib_mtrie_leaf_is_non_empty (old_ply, i);
old_ply->n_non_empty_leafs +=
ip4_fib_mtrie_leaf_is_non_empty (old_ply, i);
@@
-369,18
+366,16
@@
set_leaf (ip4_fib_mtrie_t * m,
old_ply->n_non_empty_leafs -=
ip4_fib_mtrie_leaf_is_non_empty (old_ply, dst_byte);
old_ply->n_non_empty_leafs -=
ip4_fib_mtrie_leaf_is_non_empty (old_ply, dst_byte);
- new_leaf =
ply_create (m, old_leaf,
- clib_max (old_ply->dst_address_bits_of_leaves
-
[dst_byte], ply_base_len)
,
-
ply_base_len);
+ new_leaf =
+ ply_create (m, old_leaf,
+
old_ply->dst_address_bits_of_leaves[dst_byte]
,
+ ply_base_len);
new_ply = get_next_ply_for_leaf (m, new_leaf);
/* Refetch since ply_create may move pool. */
old_ply = pool_elt_at_index (ip4_ply_pool, old_ply_index);
new_ply = get_next_ply_for_leaf (m, new_leaf);
/* Refetch since ply_create may move pool. */
old_ply = pool_elt_at_index (ip4_ply_pool, old_ply_index);
- __sync_val_compare_and_swap (&old_ply->leaves[dst_byte], old_leaf,
- new_leaf);
- ASSERT (old_ply->leaves[dst_byte] == new_leaf);
+ clib_atomic_store_rel_n (&old_ply->leaves[dst_byte], new_leaf);
old_ply->dst_address_bits_of_leaves[dst_byte] = ply_base_len;
old_ply->n_non_empty_leafs +=
old_ply->dst_address_bits_of_leaves[dst_byte] = ply_base_len;
old_ply->n_non_empty_leafs +=
@@
-451,9
+446,7
@@
set_root_leaf (ip4_fib_mtrie_t * m,
* the new one */
old_ply->dst_address_bits_of_leaves[slot] =
a->dst_address_length;
* the new one */
old_ply->dst_address_bits_of_leaves[slot] =
a->dst_address_length;
- __sync_val_compare_and_swap (&old_ply->leaves[slot],
- old_leaf, new_leaf);
- ASSERT (old_ply->leaves[slot] == new_leaf);
+ clib_atomic_store_rel_n (&old_ply->leaves[slot], new_leaf);
}
else
{
}
else
{
@@
-492,15
+485,13
@@
set_root_leaf (ip4_fib_mtrie_t * m,
if (ip4_fib_mtrie_leaf_is_terminal (old_leaf))
{
/* There is a leaf occupying the slot. Replace it with a new ply */
if (ip4_fib_mtrie_leaf_is_terminal (old_leaf))
{
/* There is a leaf occupying the slot. Replace it with a new ply */
- new_leaf =
ply_create (m, old_leaf,
- clib_max (old_ply->dst_address_bits_of_leaves
-
[dst_byte], ply_base_len)
,
-
ply_base_len);
+ new_leaf =
+ ply_create (m, old_leaf,
+
old_ply->dst_address_bits_of_leaves[dst_byte]
,
+ ply_base_len);
new_ply = get_next_ply_for_leaf (m, new_leaf);
new_ply = get_next_ply_for_leaf (m, new_leaf);
- __sync_val_compare_and_swap (&old_ply->leaves[dst_byte], old_leaf,
- new_leaf);
- ASSERT (old_ply->leaves[dst_byte] == new_leaf);
+ clib_atomic_store_rel_n (&old_ply->leaves[dst_byte], new_leaf);
old_ply->dst_address_bits_of_leaves[dst_byte] = ply_base_len;
}
else
old_ply->dst_address_bits_of_leaves[dst_byte] = ply_base_len;
}
else
@@
-549,11
+540,10
@@
unset_leaf (ip4_fib_mtrie_t * m,
old_ply->n_non_empty_leafs -=
ip4_fib_mtrie_leaf_is_non_empty (old_ply, i);
old_ply->n_non_empty_leafs -=
ip4_fib_mtrie_leaf_is_non_empty (old_ply, i);
- old_ply->leaves[i] =
- ip4_fib_mtrie_leaf_set_adj_index (a->cover_adj_index);
- old_ply->dst_address_bits_of_leaves[i] =
- clib_max (old_ply->dst_address_bits_base,
- a->cover_address_length);
+ clib_atomic_store_rel_n (&old_ply->leaves[i],
+ ip4_fib_mtrie_leaf_set_adj_index
+ (a->cover_adj_index));
+ old_ply->dst_address_bits_of_leaves[i] = a->cover_address_length;
old_ply->n_non_empty_leafs +=
ip4_fib_mtrie_leaf_is_non_empty (old_ply, i);
old_ply->n_non_empty_leafs +=
ip4_fib_mtrie_leaf_is_non_empty (old_ply, i);
@@
-622,8
+612,9
@@
unset_root_leaf (ip4_fib_mtrie_t * m,
|| (!old_leaf_is_terminal
&& unset_leaf (m, a, get_next_ply_for_leaf (m, old_leaf), 2)))
{
|| (!old_leaf_is_terminal
&& unset_leaf (m, a, get_next_ply_for_leaf (m, old_leaf), 2)))
{
- old_ply->leaves[slot] =
- ip4_fib_mtrie_leaf_set_adj_index (a->cover_adj_index);
+ clib_atomic_store_rel_n (&old_ply->leaves[slot],
+ ip4_fib_mtrie_leaf_set_adj_index
+ (a->cover_adj_index));
old_ply->dst_address_bits_of_leaves[slot] = a->cover_address_length;
}
}
old_ply->dst_address_bits_of_leaves[slot] = a->cover_address_length;
}
}
@@
-714,24
+705,23
@@
format_ip4_fib_mtrie_leaf (u8 * s, va_list * va)
return s;
}
return s;
}
-#define FORMAT_PLY(s, _p, _
i, _base_address, _ply_max_len, _indent)
\
+#define FORMAT_PLY(s, _p, _
a, _i, _base_address, _ply_max_len, _indent)
\
({ \
u32 a, ia_length; \
ip4_address_t ia; \
ip4_fib_mtrie_leaf_t _l = p->leaves[(_i)]; \
\
({ \
u32 a, ia_length; \
ip4_address_t ia; \
ip4_fib_mtrie_leaf_t _l = p->leaves[(_i)]; \
\
- a = (_base_address) + ((_
i
) << (32 - (_ply_max_len))); \
+ a = (_base_address) + ((_
a
) << (32 - (_ply_max_len))); \
ia.as_u32 = clib_host_to_net_u32 (a); \
ia_length = (_p)->dst_address_bits_of_leaves[(_i)]; \
ia.as_u32 = clib_host_to_net_u32 (a); \
ia_length = (_p)->dst_address_bits_of_leaves[(_i)]; \
- s = format (s, "\n%U%
20U %U",
\
- format_white_space, (_indent) +
2
, \
+ s = format (s, "\n%U%
U %U",
\
+ format_white_space, (_indent) +
4
, \
format_ip4_address_and_length, &ia, ia_length, \
format_ip4_fib_mtrie_leaf, _l); \
\
if (ip4_fib_mtrie_leaf_is_next_ply (_l)) \
format_ip4_address_and_length, &ia, ia_length, \
format_ip4_fib_mtrie_leaf, _l); \
\
if (ip4_fib_mtrie_leaf_is_next_ply (_l)) \
- s = format (s, "\n%U%U", \
- format_white_space, (_indent) + 2, \
- format_ip4_fib_mtrie_ply, m, a, \
+ s = format (s, "\n%U", \
+ format_ip4_fib_mtrie_ply, m, a, (_indent) + 8, \
ip4_fib_mtrie_leaf_get_next_ply_index (_l)); \
s; \
})
ip4_fib_mtrie_leaf_get_next_ply_index (_l)); \
s; \
})
@@
-741,21
+731,20
@@
format_ip4_fib_mtrie_ply (u8 * s, va_list * va)
{
ip4_fib_mtrie_t *m = va_arg (*va, ip4_fib_mtrie_t *);
u32 base_address = va_arg (*va, u32);
{
ip4_fib_mtrie_t *m = va_arg (*va, ip4_fib_mtrie_t *);
u32 base_address = va_arg (*va, u32);
+ u32 indent = va_arg (*va, u32);
u32 ply_index = va_arg (*va, u32);
ip4_fib_mtrie_8_ply_t *p;
u32 ply_index = va_arg (*va, u32);
ip4_fib_mtrie_8_ply_t *p;
- u32 indent;
int i;
p = pool_elt_at_index (ip4_ply_pool, ply_index);
int i;
p = pool_elt_at_index (ip4_ply_pool, ply_index);
- indent = format_get_indent (s);
- s = format (s, "ply index %d, %d non-empty leaves", ply_index,
- p->n_non_empty_leafs);
+ s = format (s, "%Uply index %d, %d non-empty leaves",
+ format_white_space, indent, ply_index, p->n_non_empty_leafs);
for (i = 0; i < ARRAY_LEN (p->leaves); i++)
{
if (ip4_fib_mtrie_leaf_is_non_empty (p, i))
{
for (i = 0; i < ARRAY_LEN (p->leaves); i++)
{
if (ip4_fib_mtrie_leaf_is_non_empty (p, i))
{
- s = FORMAT_PLY (s, p, i, base_address,
+ s = FORMAT_PLY (s, p, i,
i,
base_address,
p->dst_address_bits_base + 8, indent);
}
}
p->dst_address_bits_base + 8, indent);
}
}
@@
-791,7
+780,7
@@
format_ip4_fib_mtrie (u8 * s, va_list * va)
if (p->dst_address_bits_of_leaves[slot] > 0)
{
if (p->dst_address_bits_of_leaves[slot] > 0)
{
- s = FORMAT_PLY (s, p,
slot, base_address, 16, 2
);
+ s = FORMAT_PLY (s, p,
i, slot, base_address, 16, 0
);
}
}
}
}
}
}
@@
-812,11
+801,7
@@
ip4_mtrie_module_init (vlib_main_t * vm)
if (0 == im->mtrie_heap_size)
im->mtrie_heap_size = IP4_FIB_DEFAULT_MTRIE_HEAP_SIZE;
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 */ );
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);
/* Burn one ply so index 0 is taken */
old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap);