X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Fnode_funcs.h;h=b1d5c7bcacb2fa1bbc3a78e8eba17372b686ede4;hb=33b18d40c77875ebd4bf807e668bda6479904936;hp=b33f4960a90d5d45b29cb73cebca493dbcf08b30;hpb=8b60fb0fe6e29aac1847c0b381c0f84165b27b61;p=vpp.git diff --git a/src/vlib/node_funcs.h b/src/vlib/node_funcs.h index b33f4960a90..b1d5c7bcacb 100644 --- a/src/vlib/node_funcs.h +++ b/src/vlib/node_funcs.h @@ -47,6 +47,7 @@ #include #include +#include #ifdef CLIB_SANITIZE_ADDR #include @@ -224,37 +225,40 @@ vlib_node_get_state (vlib_main_t * vm, u32 node_index) } always_inline void -vlib_node_set_interrupt_pending_with_data (vlib_main_t * vm, u32 node_index, - u32 data) +vlib_node_set_flag (vlib_main_t *vm, u32 node_index, u16 flag, u8 enable) { - vlib_node_main_t *nm = &vm->node_main; - vlib_node_t *n = vec_elt (nm->nodes, node_index); - vlib_node_interrupt_t *i; - ASSERT (n->type == VLIB_NODE_TYPE_INPUT); + vlib_node_runtime_t *r; + vlib_node_t *n; + + n = vlib_get_node (vm, node_index); + r = vlib_node_get_runtime (vm, node_index); - if (vm == vlib_get_main ()) + if (enable) { - /* local thread */ - vec_add2 (nm->pending_local_interrupts, i, 1); - i->node_runtime_index = n->runtime_index; - i->data = data; + n->flags |= flag; + r->flags |= flag; } else { - /* remote thread */ - clib_spinlock_lock (&nm->pending_interrupt_lock); - vec_add2 (nm->pending_remote_interrupts, i, 1); - i->node_runtime_index = n->runtime_index; - i->data = data; - *nm->pending_remote_interrupts_notify = 1; - clib_spinlock_unlock (&nm->pending_interrupt_lock); + n->flags &= ~flag; + r->flags &= ~flag; } } always_inline void -vlib_node_set_interrupt_pending (vlib_main_t * vm, u32 node_index) +vlib_node_set_interrupt_pending (vlib_main_t *vm, u32 node_index) { - vlib_node_set_interrupt_pending_with_data (vm, node_index, 0); + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n = vec_elt (nm->nodes, node_index); + + ASSERT (n->type == VLIB_NODE_TYPE_INPUT); + + if (vm != vlib_get_main ()) + clib_interrupt_set_atomic (nm->interrupts, n->runtime_index); + else + clib_interrupt_set (nm->interrupts, n->runtime_index); + + __atomic_store_n (nm->pending_interrupts, 1, __ATOMIC_RELEASE); } always_inline vlib_process_t * @@ -844,7 +848,7 @@ vlib_process_signal_event_helper (vlib_node_main_t * nm, if (!data_vec && vec_len (nm->recycled_event_data_vectors)) { data_vec = vec_pop (nm->recycled_event_data_vectors); - _vec_len (data_vec) = 0; + vec_reset_length (data_vec); } l = vec_len (data_vec); @@ -1206,6 +1210,9 @@ void vlib_node_rename (vlib_main_t * vm, u32 node_index, char *fmt, ...); macro. */ u32 vlib_register_node (vlib_main_t * vm, vlib_node_registration_t * r); +/* Register all node function variants */ +void vlib_register_all_node_march_variants (vlib_main_t *vm); + /* Register all static nodes registered via VLIB_REGISTER_NODE. */ void vlib_register_all_static_nodes (vlib_main_t * vm); @@ -1214,6 +1221,12 @@ void vlib_start_process (vlib_main_t * vm, uword process_index); /* Sync up runtime and main node stats. */ void vlib_node_sync_stats (vlib_main_t * vm, vlib_node_t * n); +void vlib_node_runtime_sync_stats (vlib_main_t *vm, vlib_node_runtime_t *r, + uword n_calls, uword n_vectors, + uword n_clocks); +void vlib_node_runtime_sync_stats_node (vlib_node_t *n, vlib_node_runtime_t *r, + uword n_calls, uword n_vectors, + uword n_clocks); /* Node graph initialization function. */ clib_error_t *vlib_node_main_init (vlib_main_t * vm); @@ -1256,6 +1269,13 @@ vlib_node_set_dispatch_wrapper (vlib_main_t *vm, vlib_node_function_t *fn) return 0; } +int vlib_node_set_march_variant (vlib_main_t *vm, u32 node_index, + clib_march_variant_type_t march_variant); + +vlib_node_function_t * +vlib_node_get_preferred_node_fn_variant (vlib_main_t *vm, + vlib_node_fn_registration_t *regs); + #endif /* included_vlib_node_funcs_h */ /*