X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fdpo%2Fload_balance.c;h=fb876a09ec2af04e2c6e4b181b2459727b7e47a9;hb=b2c31b685fd2cf28436ca32bc93e23eb24c74878;hp=48f77986f57aa6be9411679932747d6c3729ee54;hpb=ac64b71b2893341b2e342865c209ee63c2dc3138;p=vpp.git diff --git a/src/vnet/dpo/load_balance.c b/src/vnet/dpo/load_balance.c index 48f77986f57..fb876a09ec2 100644 --- a/src/vnet/dpo/load_balance.c +++ b/src/vnet/dpo/load_balance.c @@ -13,7 +13,6 @@ * limitations under the License. */ -#include #include #include #include @@ -22,6 +21,9 @@ #include #include #include +#include +#include +#include /* * distribution error tolerance for load-balancing @@ -30,21 +32,19 @@ const f64 multipath_next_hop_error_tolerance = 0.1; static const char *load_balance_attr_names[] = LOAD_BALANCE_ATTR_NAMES; -#undef LB_DEBUG -#ifdef LB_DEBUG +/** + * the logger + */ +vlib_log_class_t load_balance_logger; + #define LB_DBG(_lb, _fmt, _args...) \ { \ - u8* _tmp =NULL; \ - clib_warning("lb:[%s]:" _fmt, \ - load_balance_format(load_balance_get_index((_lb)), \ - 0, _tmp), \ - ##_args); \ - vec_free(_tmp); \ + vlib_log_debug(load_balance_logger, \ + "lb:[%U]:" _fmt, \ + format_load_balance, load_balance_get_index(_lb), \ + LOAD_BALANCE_FORMAT_NONE, \ + ##_args); \ } -#else -#define LB_DBG(_p, _fmt, _args...) -#endif - /** * Pool of all DPOs. It's not static so the DP can have fast access @@ -94,12 +94,33 @@ static load_balance_t * load_balance_alloc_i (void) { load_balance_t *lb; + u8 need_barrier_sync = 0; + vlib_main_t *vm = vlib_get_main(); + ASSERT (vm->thread_index == 0); + + pool_get_aligned_will_expand (load_balance_pool, need_barrier_sync, + CLIB_CACHE_LINE_BYTES); + if (need_barrier_sync) + vlib_worker_thread_barrier_sync (vm); pool_get_aligned(load_balance_pool, lb, CLIB_CACHE_LINE_BYTES); - memset(lb, 0, sizeof(*lb)); + clib_memset(lb, 0, sizeof(*lb)); lb->lb_map = INDEX_INVALID; lb->lb_urpf = INDEX_INVALID; + + if (need_barrier_sync == 0) + { + need_barrier_sync += vlib_validate_combined_counter_will_expand + (&(load_balance_main.lbm_to_counters), + load_balance_get_index(lb)); + need_barrier_sync += vlib_validate_combined_counter_will_expand + (&(load_balance_main.lbm_via_counters), + load_balance_get_index(lb)); + if (need_barrier_sync) + vlib_worker_thread_barrier_sync (vm); + } + vlib_validate_combined_counter(&(load_balance_main.lbm_to_counters), load_balance_get_index(lb)); vlib_validate_combined_counter(&(load_balance_main.lbm_via_counters), @@ -109,6 +130,9 @@ load_balance_alloc_i (void) vlib_zero_combined_counter(&(load_balance_main.lbm_via_counters), load_balance_get_index(lb)); + if (need_barrier_sync) + vlib_worker_thread_barrier_release (vm); + return (lb); } @@ -180,6 +204,7 @@ format_load_balance (u8 * s, va_list * args) return (load_balance_format(lbi, flags, 0, s)); } + static u8* format_load_balance_dpo (u8 * s, va_list * args) { @@ -189,6 +214,26 @@ format_load_balance_dpo (u8 * s, va_list * args) return (load_balance_format(lbi, LOAD_BALANCE_FORMAT_DETAIL, indent, s)); } +flow_hash_config_t +load_balance_get_default_flow_hash (dpo_proto_t lb_proto) +{ + switch (lb_proto) + { + case DPO_PROTO_IP4: + case DPO_PROTO_IP6: + return (IP_FLOW_HASH_DEFAULT); + + case DPO_PROTO_MPLS: + return (MPLS_FLOW_HASH_DEFAULT); + + case DPO_PROTO_ETHERNET: + case DPO_PROTO_BIER: + case DPO_PROTO_NSH: + break; + } + + return (0); +} static load_balance_t * load_balance_create_i (u32 num_buckets, @@ -385,7 +430,7 @@ ip_multipath_normalize_next_hops (const load_balance_path_t * raw_next_hops, } else { - clib_memcpy (nhs, raw_next_hops, n_nhs * sizeof (raw_next_hops[0])); + clib_memcpy_fast (nhs, raw_next_hops, n_nhs * sizeof (raw_next_hops[0])); qsort (nhs, n_nhs, sizeof (nhs[0]), (void *) next_hop_sort_by_weight); } @@ -429,7 +474,7 @@ ip_multipath_normalize_next_hops (const load_balance_path_t * raw_next_hops, /* * when the weight skew is high (norm is small) and n == nf. * without this correction the path with a low weight would have - * no represenation in the load-balanace - don't want that. + * no representation in the load-balanace - don't want that. * If the weight skew is high so the load-balance has many buckets * to allow it. pays ya money takes ya choice. */ @@ -947,6 +992,9 @@ load_balance_module_init (void) lbi = load_balance_create(1, DPO_PROTO_IP4, 0); load_balance_set_bucket(lbi, 0, drop_dpo_get(DPO_PROTO_IP4)); + load_balance_logger = + vlib_log_register_class("dpo", "load-balance"); + load_balance_map_module_init(); } @@ -981,12 +1029,12 @@ load_balance_show (vlib_main_t * vm, { load_balance_t *lb; - pool_foreach(lb, load_balance_pool, - ({ + pool_foreach (lb, load_balance_pool) + { vlib_cli_output (vm, "%U", format_load_balance, load_balance_get_index(lb), LOAD_BALANCE_FORMAT_NONE); - })); + } } return 0; @@ -1098,7 +1146,7 @@ load_balance_inline (vlib_main_t * vm, vnet_buffer(b0)->ip.flow_hash = bier_compute_flow_hash(bh0); } - dpo0 = load_balance_get_bucket_i(lb0, + dpo0 = load_balance_get_bucket_i(lb0, vnet_buffer(b0)->ip.flow_hash & (lb0->lb_n_buckets_minus_1));