From 04c0130f588eb11114c17d925a7a928c8f900b9b Mon Sep 17 00:00:00 2001 From: jaszha03 Date: Fri, 27 Sep 2019 15:42:02 -0500 Subject: ip: refactor ip4_mtrie to atomically unset leaves ip4_mtrie set leaves atomically in set_leaf () and set_root_leaf () but deleted leaves using regular stores in unset_leaf () and unset_root_leaf (). Changed leaf deletion to update mtrie using atomic store-release. Slight performance improvement was observed in benchmarking on Qualcomm and Xeon machines. Benchmarking involved running 'ip route add' and 'ip route del' on vpp instances. Below are the routes/second for adding and deleting 100k routes before and after the store-release changes: Xeon Add Routes Before: 1.140e6, 1.139e6, 1.148e6, 1.158e6, 1.155e6 Xeon Add Routes After: 1.167e6, 1.170e6, 1.174e6, 1.173e6, 1.169e6 Xeon Del Routes Before: 7.287e7, 8.089e7, 6.048e7, 7.171e7, 7.821e7 Xeon Del Routes After: 8.729e7, 7.353e7, 7.856e7, 8.209e7, 7.787e7 Qualcomm Add Routes Before: 3.709e5, 3.954e5, 3.739e5, 3.759e5, 3.671e5 Qualcomm Add Routes After: 3.879e5, 3.967e5, 3.936e5, 3.764e5, 3.817e5 Qualcomm Del Routes Before: 1.286e7, 1.379e7, 1.353e7, 1.230e7, 1.331e7 Qualcomm Del Routes After: 1.411e7, 1.355e7, 1.373e7, 1.394e7, 1.314e7 Type: refactor Change-Id: If3acd25a2fb87addd0eb13d82d3c8f46579e8060 Signed-off-by: Jason Zhang Reviewed-by: Lijian Zhang Reviewed-by: Ruifeng Wang --- src/vnet/ip/ip4_mtrie.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/vnet/ip/ip4_mtrie.c b/src/vnet/ip/ip4_mtrie.c index ef6a033be7d..be79883dde0 100755 --- a/src/vnet/ip/ip4_mtrie.c +++ b/src/vnet/ip/ip4_mtrie.c @@ -549,8 +549,9 @@ 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->leaves[i] = - ip4_fib_mtrie_leaf_set_adj_index (a->cover_adj_index); + 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 += @@ -620,8 +621,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_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; } } -- cgit 1.2.3-korg