X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Fmain.c;h=c7c4aba3080ba79849c83a3a1d47955efdd88392;hb=eee099e9579083fbce665e8c4a3617b9f0e5ea2f;hp=62da7b9ff0a2c895486739e67b057bef6cf9e50e;hpb=f553a2cbbb8cca84ebf033335ebd2cd26dc19d69;p=vpp.git diff --git a/src/vlib/main.c b/src/vlib/main.c index 62da7b9ff0a..c7c4aba3080 100644 --- a/src/vlib/main.c +++ b/src/vlib/main.c @@ -614,7 +614,7 @@ vlib_node_sync_stats (vlib_main_t * vm, vlib_node_t * n) if (n->type == VLIB_NODE_TYPE_PROCESS) { /* Nothing to do for PROCESS nodes except in main thread */ - if (vm != &vlib_global_main) + if (vm != vlib_get_first_main ()) return; vlib_process_t *p = vlib_get_process_from_node (vm, n); @@ -747,10 +747,10 @@ elog_save_buffer (vlib_main_t * vm, void vlib_post_mortem_dump (void) { - vlib_main_t *vm = &vlib_global_main; + vlib_global_main_t *vgm = vlib_get_global_main (); - for (int i = 0; i < vec_len (vm->post_mortem_callbacks); i++) - (vm->post_mortem_callbacks[i]) (); + for (int i = 0; i < vec_len (vgm->post_mortem_callbacks); i++) + (vgm->post_mortem_callbacks[i]) (); } /* *INDENT-OFF* */ @@ -901,7 +901,7 @@ vlib_elog_main_loop_event (vlib_main_t * vm, u32 node_index, u64 time, u32 n_vectors, u32 is_return) { - vlib_main_t *evm = &vlib_global_main; + vlib_main_t *evm = vlib_get_first_main (); elog_main_t *em = vlib_get_elog_main (); int enabled = evm->elog_trace_graph_dispatch | evm->elog_trace_graph_circuit; @@ -934,29 +934,14 @@ vlib_elog_main_loop_event (vlib_main_t * vm, } } -#if VLIB_BUFFER_TRACE_TRAJECTORY > 0 -void (*vlib_buffer_trace_trajectory_cb) (vlib_buffer_t * b, u32 node_index); -void (*vlib_buffer_trace_trajectory_init_cb) (vlib_buffer_t * b); - -void -vlib_buffer_trace_trajectory_init (vlib_buffer_t * b) -{ - if (PREDICT_TRUE (vlib_buffer_trace_trajectory_init_cb != 0)) - { - (*vlib_buffer_trace_trajectory_init_cb) (b); - } -} - -#endif - static inline void add_trajectory_trace (vlib_buffer_t * b, u32 node_index) { #if VLIB_BUFFER_TRACE_TRAJECTORY > 0 - if (PREDICT_TRUE (vlib_buffer_trace_trajectory_cb != 0)) - { - (*vlib_buffer_trace_trajectory_cb) (b, node_index); - } + if (PREDICT_FALSE (b->trajectory_nb >= VLIB_BUFFER_TRACE_TRAJECTORY_MAX)) + return; + b->trajectory_trace[b->trajectory_nb] = node_index; + b->trajectory_nb++; #endif } @@ -1091,7 +1076,8 @@ dispatch_node (vlib_main_t * vm, nm->input_node_counts_by_state[VLIB_NODE_STATE_INTERRUPT] -= 1; nm->input_node_counts_by_state[VLIB_NODE_STATE_POLLING] += 1; - if (PREDICT_FALSE (vlib_global_main.elog_trace_graph_dispatch)) + if (PREDICT_FALSE ( + vlib_get_first_main ()->elog_trace_graph_dispatch)) { vlib_worker_thread_t *w = vlib_worker_threads + vm->thread_index; @@ -1126,7 +1112,8 @@ dispatch_node (vlib_main_t * vm, + vm->thread_index; node->flags |= VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE; - if (PREDICT_FALSE (vlib_global_main.elog_trace_graph_dispatch)) + if (PREDICT_FALSE ( + vlib_get_first_main ()->elog_trace_graph_dispatch)) { ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e, w->elog_track); @@ -1594,6 +1581,8 @@ vlib_main_or_worker_loop (vlib_main_t * vm, int is_main) if (PREDICT_FALSE (vm->check_frame_queues + frame_queue_check_counter)) { u32 processed = 0; + vlib_frame_queue_dequeue_fn_t *fn = + vlib_buffer_func_main.frame_queue_dequeue_fn; if (vm->check_frame_queues) { @@ -1602,7 +1591,7 @@ vlib_main_or_worker_loop (vlib_main_t * vm, int is_main) } vec_foreach (fqm, tm->frame_queue_mains) - processed += vlib_frame_queue_dequeue (vm, fqm); + processed += (fn) (vm, fqm); /* No handoff queue work found? */ if (processed) @@ -1794,26 +1783,26 @@ vlib_worker_loop (vlib_main_t * vm) vlib_main_or_worker_loop (vm, /* is_main */ 0); } -vlib_main_t vlib_global_main; +vlib_global_main_t vlib_global_main; void vlib_add_del_post_mortem_callback (void *cb, int is_add) { - vlib_main_t *vm = &vlib_global_main; + vlib_global_main_t *vgm = vlib_get_global_main (); int i; if (is_add == 0) { - for (i = vec_len (vm->post_mortem_callbacks) - 1; i >= 0; i--) - if (vm->post_mortem_callbacks[i] == cb) - vec_del1 (vm->post_mortem_callbacks, i); + for (i = vec_len (vgm->post_mortem_callbacks) - 1; i >= 0; i--) + if (vgm->post_mortem_callbacks[i] == cb) + vec_del1 (vgm->post_mortem_callbacks, i); return; } - for (i = 0; i < vec_len (vm->post_mortem_callbacks); i++) - if (vm->post_mortem_callbacks[i] == cb) + for (i = 0; i < vec_len (vgm->post_mortem_callbacks); i++) + if (vgm->post_mortem_callbacks[i] == cb) return; - vec_add1 (vm->post_mortem_callbacks, cb); + vec_add1 (vgm->post_mortem_callbacks, cb); } static void @@ -1836,6 +1825,7 @@ elog_post_mortem_dump (void) static clib_error_t * vlib_main_configure (vlib_main_t * vm, unformat_input_t * input) { + vlib_global_main_t *vgm = vlib_get_global_main (); int turn_on_mem_trace = 0; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) @@ -1844,9 +1834,9 @@ vlib_main_configure (vlib_main_t * vm, unformat_input_t * input) turn_on_mem_trace = 1; else if (unformat (input, "elog-events %d", - &vm->configured_elog_ring_size)) - vm->configured_elog_ring_size = - 1 << max_log2 (vm->configured_elog_ring_size); + &vgm->configured_elog_ring_size)) + vgm->configured_elog_ring_size = + 1 << max_log2 (vgm->configured_elog_ring_size); else if (unformat (input, "elog-post-mortem-dump")) vlib_add_del_post_mortem_callback (elog_post_mortem_dump, /* is_add */ 1); @@ -1923,21 +1913,22 @@ vl_api_get_elog_trace_api_messages (void) int vlib_main (vlib_main_t * volatile vm, unformat_input_t * input) { + vlib_global_main_t *vgm = vlib_get_global_main (); clib_error_t *volatile error; vlib_node_main_t *nm = &vm->node_main; vm->queue_signal_callback = placeholder_queue_signal_callback; /* Reconfigure event log which is enabled very early */ - if (vm->configured_elog_ring_size && - vm->configured_elog_ring_size != vm->elog_main.event_ring_size) - elog_resize (&vm->elog_main, vm->configured_elog_ring_size); + if (vgm->configured_elog_ring_size && + vgm->configured_elog_ring_size != vgm->elog_main.event_ring_size) + elog_resize (&vgm->elog_main, vgm->configured_elog_ring_size); vl_api_set_elog_main (vlib_get_elog_main ()); (void) vl_api_set_elog_trace_api_messages (1); /* Default name. */ - if (!vm->name) - vm->name = "VLIB"; + if (!vgm->name) + vgm->name = "VLIB"; if ((error = vlib_physmem_init (vm))) { @@ -2005,8 +1996,8 @@ vlib_main (vlib_main_t * volatile vm, unformat_input_t * input) } /* See unix/main.c; most likely already set up */ - if (vm->init_functions_called == 0) - vm->init_functions_called = hash_create (0, /* value bytes */ 0); + if (vgm->init_functions_called == 0) + vgm->init_functions_called = hash_create (0, /* value bytes */ 0); if ((error = vlib_call_all_init_functions (vm))) goto done; @@ -2048,7 +2039,7 @@ vlib_main (vlib_main_t * volatile vm, unformat_input_t * input) vm->damping_constant = exp (-1.0 / 20.0); /* Sort per-thread init functions before we start threads */ - vlib_sort_init_exit_functions (&vm->worker_init_function_registrations); + vlib_sort_init_exit_functions (&vgm->worker_init_function_registrations); /* Call all main loop enter functions. */ {