X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Fmain.h;h=64f2859c055bfcaa1c067677db562f8df5142399;hb=71615399e194847d7833b744caedab9b841733e5;hp=98bc823d874ca9e4a8115171197688ec81beb0cf;hpb=e9f929b52ddb741ec1e4cb2d92c6be1e798933a0;p=vpp.git diff --git a/src/vlib/main.h b/src/vlib/main.h index 98bc823d874..64f2859c055 100644 --- a/src/vlib/main.h +++ b/src/vlib/main.h @@ -46,6 +46,7 @@ #include #include #include +#include #include @@ -58,6 +59,7 @@ typedef struct vlib_main_t { + CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); /* Instruction level timing state. */ clib_time_t clib_time; @@ -80,11 +82,18 @@ typedef struct vlib_main_t u32 vector_counts_per_main_loop[2]; u32 node_counts_per_main_loop[2]; + /* Main loop hw / sw performance counters */ + u64 (*vlib_node_runtime_perf_counter_cb) (struct vlib_main_t *); + int perf_counter_id; + int perf_counter_fd; + /* Every so often we switch to the next counter. */ #define VLIB_LOG2_MAIN_LOOPS_PER_STATS_UPDATE 7 /* Jump target to exit main loop with given code. */ u32 main_loop_exit_set; + /* Set e.g. in the SIGTERM signal handler, checked in a safe place... */ + volatile u32 main_loop_exit_now; clib_longjmp_t main_loop_exit; #define VLIB_MAIN_LOOP_EXIT_NONE 0 #define VLIB_MAIN_LOOP_EXIT_PANIC 1 @@ -97,20 +106,21 @@ typedef struct vlib_main_t /* Name for e.g. syslog. */ char *name; - /* Start and size of CLIB heap. */ + /* Start of the heap. */ void *heap_base; + + /* Truncated version, to create frame indices */ + void *heap_aligned_base; + + /* Size of the heap */ uword heap_size; - vlib_buffer_main_t *buffer_main; + /* Pool of buffer free lists. */ + vlib_buffer_free_list_t *buffer_free_list_pool; + /* physical memory main structure. */ vlib_physmem_main_t physmem_main; - /* Allocate/free buffer memory for DMA transfers, descriptor rings, etc. - buffer memory is guaranteed to be cache-aligned. */ - void *(*os_physmem_alloc_aligned) (vlib_physmem_main_t * pm, - uword n_bytes, uword alignment); - void (*os_physmem_free) (void *x); - /* Node graph main structure. */ vlib_node_main_t node_main; @@ -129,9 +139,6 @@ typedef struct vlib_main_t struct vlib_node_runtime_t * node, vlib_frame_t * frame); - /* Multicast distribution. Set to zero for MC disabled. */ - mc_main_t *mc_main; - /* Stream index to use for distribution when MC is enabled. */ u32 mc_stream_index; @@ -140,6 +147,10 @@ typedef struct vlib_main_t /* Event logger. */ elog_main_t elog_main; + /* Event logger trace flags */ + int elog_trace_api_messages; + int elog_trace_cli_commands; + /* Node call and return event types. */ elog_event_type_t *node_call_elog_event_types; elog_event_type_t *node_return_elog_event_types; @@ -156,9 +167,7 @@ typedef struct vlib_main_t uword *init_functions_called; /* to compare with node runtime */ - u32 cpu_index; - - void **mbuf_alloc_list; + u32 thread_index; /* List of init functions to call, setup by constructors */ _vlib_init_function_list_elt_t *init_function_registrations; @@ -167,13 +176,41 @@ typedef struct vlib_main_t _vlib_init_function_list_elt_t *main_loop_exit_function_registrations; _vlib_init_function_list_elt_t *api_init_function_registrations; vlib_config_function_runtime_t *config_function_registrations; - mc_serialize_msg_t *mc_msg_registrations; /* mc_main is a pointer... */ /* control-plane API queue signal pending, length indication */ volatile u32 queue_signal_pending; volatile u32 api_queue_nonempty; void (*queue_signal_callback) (struct vlib_main_t *); u8 **argv; + + /* Top of (worker) dispatch loop callback */ + volatile void (*worker_thread_main_loop_callback) (struct vlib_main_t *); + + /* debugging */ + volatile int parked_at_barrier; + + /* Attempt to do a post-mortem elog dump */ + int elog_post_mortem_dump; + + /* + * Need to call vlib_worker_thread_node_runtime_update before + * releasing worker thread barrier. Only valid in vlib_global_main. + */ + int need_vlib_worker_thread_node_runtime_update; + + /* + * Barrier epoch - Set to current time, each time barrier_sync or + * barrier_release is called with zero recursion. + */ + f64 barrier_epoch; + + /* Earliest barrier can be closed again */ + f64 barrier_no_close_before; + + /* Vector of pending RPC requests */ + uword *pending_rpc_requests; + clib_spinlock_t pending_rpc_lock; + } vlib_main_t; /* Global main structure. */ @@ -306,6 +343,9 @@ vlib_increment_main_loop_counter (vlib_main_t * vm) vm->main_loop_nodes_processed = 0; vm->vector_counts_per_main_loop[i] = v; vm->node_counts_per_main_loop[i] = n; + + if (PREDICT_FALSE (vm->main_loop_exit_now)) + clib_longjmp (&vm->main_loop_exit, VLIB_MAIN_LOOP_EXIT_CLI); } always_inline void vlib_set_queue_signal_callback @@ -317,7 +357,7 @@ always_inline void vlib_set_queue_signal_callback /* Main routine. */ int vlib_main (vlib_main_t * vm, unformat_input_t * input); -/* Thread stacks, for os_get_cpu_number */ +/* Thread stacks, for os_get_thread_index */ extern u8 **vlib_thread_stacks; /* Number of thread stacks that the application needs */