X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Fnode.c;h=ed474eb531186f110bf30689c16dead4863d86d5;hb=2179513b71963a0b42ca6f1f2b641e79ce89447b;hp=17dd2ea87d42e76271fb37d3be1e7cf61ec60812;hpb=e86a8edd3c14fb41ace2a12efd17bc7772bf623f;p=vpp.git diff --git a/src/vlib/node.c b/src/vlib/node.c index 17dd2ea87d4..ed474eb5311 100644 --- a/src/vlib/node.c +++ b/src/vlib/node.c @@ -324,11 +324,32 @@ register_node (vlib_main_t * vm, vlib_node_registration_t * r) ASSERT (VLIB_NODE_TYPE_INTERNAL == zero.type); } + if (r->node_fn_registrations) + { + vlib_node_fn_registration_t *fnr = r->node_fn_registrations; + int priority = -1; + + /* to avoid confusion, please remove ".function " statiement from + CLIB_NODE_REGISTRATION() if using function function candidates */ + ASSERT (r->function == 0); + + while (fnr) + { + if (fnr->priority > priority) + { + priority = fnr->priority; + r->function = fnr->function; + } + fnr = fnr->next_registration; + } + } + ASSERT (r->function != 0); n = clib_mem_alloc_no_fail (sizeof (n[0])); memset (n, 0, sizeof (n[0])); n->index = vec_len (nm->nodes); + n->node_fn_registrations = r->node_fn_registrations; vec_add1 (nm->nodes, n); @@ -543,20 +564,20 @@ vlib_register_all_static_nodes (vlib_main_t * vm) } } -vlib_node_t *** -vlib_node_get_nodes (vlib_main_t * vm, u32 max_threads, int include_stats) +void +vlib_node_get_nodes (vlib_main_t * vm, u32 max_threads, int include_stats, + int barrier_sync, vlib_node_t **** node_dupsp, + vlib_main_t *** stat_vmsp) { vlib_node_main_t *nm = &vm->node_main; vlib_node_t *n; - static vlib_node_t ***node_dups; + vlib_node_t ***node_dups = *node_dupsp; vlib_node_t **nodes; - static vlib_main_t **stat_vms; + vlib_main_t **stat_vms = *stat_vmsp; vlib_main_t *stat_vm; uword i, j; u32 threads_to_serialize; - vec_reset_length (node_dups); - if (vec_len (stat_vms) == 0) { for (i = 0; i < vec_len (vlib_mains); i++) @@ -569,11 +590,14 @@ vlib_node_get_nodes (vlib_main_t * vm, u32 max_threads, int include_stats) threads_to_serialize = clib_min (max_threads, vec_len (stat_vms)); + vec_validate (node_dups, threads_to_serialize - 1); + /* * Barrier sync across stats scraping. * Otherwise, the counts will be grossly inaccurate. */ - vlib_worker_thread_barrier_sync (vm); + if (barrier_sync) + vlib_worker_thread_barrier_sync (vm); for (j = 0; j < threads_to_serialize; j++) { @@ -589,12 +613,17 @@ vlib_node_get_nodes (vlib_main_t * vm, u32 max_threads, int include_stats) } } - nodes = vec_dup (nm->nodes); - vec_add1 (node_dups, nodes); + nodes = node_dups[j]; + vec_validate (nodes, vec_len (nm->nodes) - 1); + clib_memcpy (nodes, nm->nodes, vec_len (nm->nodes) * sizeof (nodes[0])); + node_dups[j] = nodes; } - vlib_worker_thread_barrier_release (vm); - return node_dups; + if (barrier_sync) + vlib_worker_thread_barrier_release (vm); + + *node_dupsp = node_dups; + *stat_vmsp = stat_vms; } clib_error_t *