51 #define VLIB_FRAME_SIZE_ALLOC (VLIB_FRAME_SIZE + 4) 64 #define VLIB_FRAME_SIZE_EXTRA 4 69 #define VLIB_FRAME_MAGIC (0xabadc0ed) 70 n_bytes +=
sizeof (
u32);
92 u32 n_scalar_bytes,
u32 n_vector_bytes)
94 uword key = (n_scalar_bytes << 16) | n_vector_bytes;
117 u32 fi, l, n, scalar_size, vector_size;
258 if (n_alloc + n_free > 0)
267 .path =
"show vlib frame-allocation",
268 .short_help =
"Show node dispatch frame statistics",
306 tmp = owner_next_frame[0];
307 owner_next_frame[0] = next_frame[0];
361 u32 allocate_new_next_frame)
392 if (n_used >=
VLIB_FRAME_SIZE || (allocate_new_next_frame && n_used > 0))
432 u32 n_before, n_after;
441 ASSERT (n_after >= n_before);
467 u32 n_vectors_in_frame;
469 if (DPDK == 0 && CLIB_DEBUG > 0)
532 v1 = v0 + n_vectors_in_frame;
584 if (vm != &vlib_global_main)
return;
616 u32 ca0, ca1, v0, v1, cl0, cl1, r;
624 cl1 = cl0 + n_clocks;
655 n_calls, n_vectors, n_clocks);
668 .path =
"event-logger clear",
669 .short_help =
"Clear the event log",
680 char * file, * chroot_file;
683 if (!
unformat (input,
"%s", &file))
691 if (strstr(file,
"..") || index(file,
'/'))
697 chroot_file = (
char *)
format (0,
"/tmp/%s%c", file, 0);
714 .path =
"event-logger save",
715 .short_help =
"event-logger save <filename> (saves log in /tmp/<filename>)",
733 .path =
"event-logger stop",
734 .short_help =
"Stop the event-logger",
752 .path =
"event-logger restart",
753 .short_help =
"Restart the event-logger",
776 vlib_cli_output (vm,
"Resized ring and restarted the event logger...");
781 .path =
"event-logger resize",
782 .short_help =
"event-logger resize <nnn>",
802 "running" :
"stopped");
809 if (n_events_to_show == 0)
821 u32 n_events_to_show;
824 n_events_to_show = 250;
827 if (
unformat (input,
"%d", &n_events_to_show))
830 n_events_to_show = ~0;
839 .path =
"show event-logger",
840 .short_help =
"Show event logger info",
883 fformat(stderr,
"Context trace for bi %d b 0x%llx, visited %d\n",
886 if (n == 0 || n > 20)
888 fformat(stderr,
"n is unreasonable\n");
893 for (i = 0; i < n; i++)
901 fformat(stderr,
"Skip bogus node index %d\n", node_index);
912 "in vlib/buffers.h, #define VLIB_BUFFER_TRACE_TRAJECTORY 1\n");
940 return last_time_stamp;
944 && dispatch_state != VLIB_NODE_STATE_INTERRUPT)
951 return last_time_stamp;
993 n = node->
function (vm, node, frame);
996 n = node->
function (vm, node, frame);
1008 t - last_time_stamp);
1012 if ((DPDK == 0 && dispatch_state == VLIB_NODE_STATE_INTERRUPT)
1013 || (DPDK == 0 && dispatch_state == VLIB_NODE_STATE_POLLING
1018 .function = (
char *) __FUNCTION__,
1019 .
format =
"%s vector length %d, switching to %s",
1020 .format_args =
"T4i4t4",
1021 .n_enum_strings = 2,
1023 "interrupt",
"polling",
1026 struct {
u32 node_name, vector_length, is_polling; } * ed;
1028 if (dispatch_state == VLIB_NODE_STATE_INTERRUPT
1032 n->
state = VLIB_NODE_STATE_POLLING;
1033 node->
state = VLIB_NODE_STATE_POLLING;
1042 ed->vector_length = v;
1045 else if (dispatch_state == VLIB_NODE_STATE_POLLING
1046 && v <= nm->interrupt_threshold_vector_length)
1053 n->
state = VLIB_NODE_STATE_INTERRUPT;
1054 node->
state = VLIB_NODE_STATE_INTERRUPT;
1065 ed->vector_length = v;
1078 u64 last_time_stamp)
1084 u32 restore_frame_index;
1104 restore_frame_index = ~0;
1126 VLIB_NODE_STATE_POLLING,
1127 f, last_time_stamp);
1132 if (restore_frame_index != ~0)
1147 return last_time_stamp;
1224 u64 last_time_stamp)
1230 uword n_vectors, is_suspend;
1232 if (node->
state != VLIB_NODE_STATE_POLLING
1235 return last_time_stamp;
1239 t = last_time_stamp;
1279 t - last_time_stamp);
1293 uword process_index,
1294 u64 last_time_stamp)
1302 u64 t, n_vectors, is_suspend;
1304 t = last_time_stamp;
1308 return last_time_stamp;
1352 t - last_time_stamp);
1405 VLIB_NODE_STATE_POLLING,
1413 VLIB_NODE_STATE_POLLING,
1427 for (i = 0; i < l; i++)
1433 VLIB_NODE_STATE_INTERRUPT,
1451 processes_timing_wheel_data:
1495 goto processes_timing_wheel_data;
1510 int turn_on_mem_trace = 0;
1514 if (
unformat (input,
"memory-trace"))
1515 turn_on_mem_trace = 1;
1517 else if (
unformat (input,
"elog-events %d",
1527 if (turn_on_mem_trace)
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
void vlib_put_next_frame(vlib_main_t *vm, vlib_node_runtime_t *r, u32 next_index, u32 n_vectors_left)
always_inline u32 vlib_frame_index_no_check(vlib_main_t *vm, vlib_frame_t *f)
static void vlib_put_next_frame_validate(vlib_main_t *vm, vlib_node_runtime_t *rt, u32 next_index, u32 n_vectors_left)
always_inline uword round_pow2(uword x, uword pow2)
#define hash_set(h, key, value)
sll srl srl sll sra u16x4 i
#define VLIB_BUFFER_TRACE_TRAJECTORY
Compile time buffer trajectory tracing option Turn this on if you run into "bad monkey" contexts...
u32 interrupt_threshold_vector_length
vlib_process_t ** processes
clib_error_t * vlib_call_all_main_loop_enter_functions(vlib_main_t *vm)
vlib_node_runtime_t node_runtime
always_inline uword vlib_timing_wheel_data_is_timed_event(u32 d)
static void elog_show_buffer_internal(vlib_main_t *vm, u32 n_events_to_show)
always_inline vlib_node_t * vlib_get_node(vlib_main_t *vm, u32 i)
bad routing header type(not 4)") sr_error (NO_MORE_SEGMENTS
always_inline uword elog_buffer_capacity(elog_main_t *em)
u8 *(* validate_frame)(struct vlib_main_t *vm, struct vlib_node_runtime_t *, struct vlib_frame_t *f)
static clib_error_t * elog_show_buffer(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static u32 vlib_frame_alloc(vlib_main_t *vm, vlib_node_runtime_t *from_node_runtime, u32 to_next_index)
always_inline vlib_next_frame_t * vlib_node_runtime_get_next_frame(vlib_main_t *vm, vlib_node_runtime_t *n, u32 next_index)
#define VLIB_FRAME_IS_ALLOCATED
void timing_wheel_init(timing_wheel_t *w, u64 current_cpu_time, f64 cpu_clocks_per_second)
elog_time_stamp_t init_time
void clib_random_buffer_init(clib_random_buffer_t *b, uword seed)
static void dummy_queue_signal_callback(vlib_main_t *vm)
u32 current_process_index
u64 cpu_time_next_process_ready
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
always_inline void elog_reset_buffer(elog_main_t *em)
clib_error_t * vlib_node_main_init(vlib_main_t *vm)
#define VLIB_FRAME_NO_FREE_AFTER_DISPATCH
u32 clocks_since_last_overflow
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
vlib_buffer_main_t * buffer_main
#define VLIB_MAIN_LOOP_EXIT_CLI
always_inline void * vlib_process_signal_event_helper(vlib_node_main_t *nm, vlib_node_t *n, vlib_process_t *p, uword t, uword n_data_elts, uword n_data_elt_bytes)
void clib_longjmp(clib_longjmp_t *save, uword return_value)
u8 * event_data_as_vector
u8 * format_elog_event(u8 *s, va_list *va)
static clib_error_t * elog_resize(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define clib_error_report(e)
void timing_wheel_insert(timing_wheel_t *w, u64 insert_cpu_time, u32 user_data)
static void vlib_elog_main_loop_event(vlib_main_t *vm, u32 node_index, u64 time, u32 n_vectors, u32 is_return)
uword clib_setjmp(clib_longjmp_t *save, uword return_value_not_taken)
#define vec_alloc(V, N)
Allocate space for N more elements (no header, unspecified alignment)
always_inline vlib_frame_t * vlib_get_frame(vlib_main_t *vm, uword frame_index)
#define VLIB_PROCESS_RESUME_PENDING
always_inline vlib_main_t * vlib_get_main(void)
u32 * pending_interrupt_node_runtime_indices
u32 input_main_loops_per_call
#define VLIB_FRAME_SIZE_EXTRA
#define static_always_inline
always_inline uword vlib_timing_wheel_data_get_index(u32 d)
always_inline u32 vlib_frame_bytes(u32 n_scalar_bytes, u32 n_vector_bytes)
always_inline void elog_enable_disable(elog_main_t *em, int is_enabled)
vlib_node_function_t * function
void elog_init(elog_main_t *em, u32 n_events)
u64 dispatch_pending_node(vlib_main_t *vm, vlib_pending_frame_t *p, u64 last_time_stamp)
u32 main_loop_vectors_processed
static clib_error_t * elog_save_buffer(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
never_inline void vlib_node_runtime_sync_stats(vlib_main_t *vm, vlib_node_runtime_t *r, uword n_calls, uword n_vectors, uword n_clocks)
u32 vectors_since_last_overflow
clib_error_t * vlib_call_all_main_loop_exit_functions(vlib_main_t *vm)
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
always_inline void elog_track(elog_main_t *em, elog_event_type_t *type, elog_track_t *track, u32 data)
always_inline u32 vlib_node_runtime_update_stats(vlib_main_t *vm, vlib_node_runtime_t *node, uword n_calls, uword n_vectors, uword n_clocks)
u8 pre_data[VLIB_BUFFER_PRE_DATA_SIZE]
Space for inserting data before buffer start.
clib_error_t * vlib_call_all_init_functions(vlib_main_t *vm)
#define clib_warning(format, args...)
int vlib_main(vlib_main_t *vm, unformat_input_t *input)
#define vec_resize(V, N)
Resize a vector (no header, unspecified alignment) Add N elements to end of given vector V...
u64 cpu_time_main_loop_start
vlib_node_runtime_t * nodes_by_type[VLIB_N_NODE_TYPE]
#define VLIB_MAIN_LOOP_EXIT_NONE
static clib_error_t * elog_restart(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
always_inline void * vlib_frame_vector_args(vlib_frame_t *f)
static uword pointer_to_uword(const void *p)
static_always_inline uword vlib_process_startup(vlib_main_t *vm, vlib_process_t *p, vlib_frame_t *f)
static clib_error_t * vlib_main_configure(vlib_main_t *vm, unformat_input_t *input)
static u64 dispatch_suspended_process(vlib_main_t *vm, uword process_index, u64 last_time_stamp)
u32 calls_since_last_overflow
#define pool_elt_at_index(p, i)
vlib_node_stats_t stats_total
static u32 vlib_frame_alloc_to_node(vlib_main_t *vm, u32 to_node_index, u32 frame_flags)
static vlib_frame_size_t * get_frame_size_info(vlib_node_main_t *nm, u32 n_scalar_bytes, u32 n_vector_bytes)
#define VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES
always_inline void validate_frame_magic(vlib_main_t *vm, vlib_frame_t *f, vlib_node_t *n, uword next_index)
vlib_signal_timed_event_data_t * signal_timed_event_data_pool
void vlib_register_all_static_nodes(vlib_main_t *vm)
void vlib_frame_free(vlib_main_t *vm, vlib_node_runtime_t *r, vlib_frame_t *f)
u8 inline_event_data[64-3 *sizeof(u32)-2 *sizeof(u16)]
elog_event_type_t * node_return_elog_event_types
u32 polling_threshold_vector_length
u64 * n_vectors_by_next_node
always_inline u32 * vlib_frame_find_magic(vlib_frame_t *f, vlib_node_t *node)
#define VLIB_FRAME_PENDING
always_inline u32 vlib_frame_vector_byte_offset(u32 scalar_size)
always_inline vlib_frame_t * vlib_get_frame_no_check(vlib_main_t *vm, uword frame_index)
void vlib_put_frame_to_node(vlib_main_t *vm, u32 to_node_index, vlib_frame_t *f)
uword * init_functions_called
#define VLIB_FRAME_FREE_AFTER_DISPATCH
#define VLIB_ELOG_MAIN_LOOP
always_inline u32 vlib_node_runtime_update_main_loop_vector_stats(vlib_main_t *vm, vlib_node_runtime_t *node, uword n_vectors)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
void clib_time_init(clib_time_t *c)
void elog_alloc(elog_main_t *em, u32 n_events)
volatile u32 queue_signal_pending
always_inline vlib_node_t * vlib_get_next_node(vlib_main_t *vm, u32 node_index, u32 next_index)
#define VLIB_PROCESS_RETURN_LONGJMP_SUSPEND
#define uword_to_pointer(u, type)
always_inline vlib_next_frame_t * vlib_node_get_next_frame(vlib_main_t *vm, u32 node_index, u32 next_index)
static clib_error_t * vlib_cli_elog_clear(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
timing_wheel_t timing_wheel
#define VLIB_EARLY_CONFIG_FUNCTION(x, n,...)
always_inline uword elog_n_events_in_buffer(elog_main_t *em)
#define CLIB_PREFETCH(addr, size, type)
vlib_pending_frame_t * pending_frames
#define vec_free(V)
Free vector's memory (no header).
#define clib_memcpy(a, b, c)
u32 * timing_wheel_advance(timing_wheel_t *w, u64 advance_cpu_time, u32 *expired_user_data, u64 *next_expiring_element_cpu_time)
always_inline void vlib_process_sync_stats(vlib_main_t *vm, vlib_process_t *p, uword n_calls, uword n_vectors, uword n_clocks)
#define VLIB_PROCESS_RETURN_LONGJMP_RETURN
vlib_main_t vlib_global_main
#define ELOG_TYPE_DECLARE(f)
u32 n_total_events_disable_limit
always_inline u32 vlib_frame_index(vlib_main_t *vm, vlib_frame_t *f)
always_inline u32 vlib_timing_wheel_data_set_suspended_process(u32 i)
void vlib_start_process(vlib_main_t *vm, uword process_index)
static_always_inline uword vlib_process_resume(vlib_process_t *p)
#define VLIB_CLI_COMMAND(x,...)
vlib_worker_thread_t * vlib_worker_threads
#define hash_create(elts, value_bytes)
#define VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_EVENT
always_inline vlib_process_t * vlib_get_process_from_node(vlib_main_t *vm, vlib_node_t *node)
void vlib_worker_thread_barrier_sync(vlib_main_t *vm)
static void vlib_main_loop(vlib_main_t *vm)
u32 vlib_buffer_get_or_create_free_list(vlib_main_t *vm, u32 n_data_bytes, char *fmt,...)
always_inline uword vlib_process_stack_is_valid(vlib_process_t *p)
static uword vlib_process_bootstrap(uword _a)
always_inline void vlib_process_update_stats(vlib_main_t *vm, vlib_process_t *p, uword n_calls, uword n_vectors, uword n_clocks)
#define VLIB_PROCESS_STACK_MAGIC
u32 main_loop_nodes_processed
#define VLIB_PROCESS_RESUME_LONGJMP_RESUME
#define VLIB_NODE_FLAG_TRACE
void vlib_worker_thread_barrier_release(vlib_main_t *vm)
void(* queue_signal_callback)(struct vlib_main_t *)
clib_error_t * vlib_thread_init(vlib_main_t *vm)
#define vec_elt(v, i)
Get vector value at index i.
static void vlib_next_frame_change_ownership(vlib_main_t *vm, vlib_node_runtime_t *node_runtime, u32 next_index)
static clib_error_t * elog_stop(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define clib_mem_alloc_aligned_no_fail(size, align)
u32 * data_from_advancing_timing_wheel
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
u32 input_node_counts_by_state[VLIB_N_NODE_STATE]
#define VLIB_PENDING_FRAME_NO_NEXT_FRAME
vlib_pending_frame_t * suspended_process_frames
vlib_node_main_t node_main
vlib_next_frame_t * next_frames
void vlib_dump_context_trace(vlib_main_t *vm, u32 bi)
#define VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE
always_inline void vlib_increment_main_loop_counter(vlib_main_t *vm)
#define VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_CLOCK
vlib_frame_size_t * frame_sizes
void vlib_node_sync_stats(vlib_main_t *vm, vlib_node_t *n)
elog_event_type_t * node_call_elog_event_types
uword clib_calljmp(uword(*func)(uword func_arg), uword func_arg, void *stack)
u64 dispatch_node(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_node_type_t type, vlib_node_state_t dispatch_state, vlib_frame_t *frame, u64 last_time_stamp)
#define VLIB_INVALID_NODE_INDEX
always_inline vlib_node_runtime_t * vlib_node_get_runtime(vlib_main_t *vm, u32 node_index)
u32 suspended_process_frame_index
#define VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE
#define vec_foreach(var, vec)
Vector iterator.
static u64 dispatch_process(vlib_main_t *vm, vlib_process_t *p, vlib_frame_t *f, u64 last_time_stamp)
elog_track_t default_track
clib_longjmp_t return_longjmp
#define clib_error_return(e, args...)
clib_longjmp_t main_loop_exit
clib_longjmp_t resume_longjmp
void clib_mem_trace(int enable)
vlib_frame_t * vlib_get_frame_to_node(vlib_main_t *vm, u32 to_node_index)
static clib_error_t * show_frame_stats(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define CLIB_CACHE_LINE_BYTES
always_inline u64 clib_cpu_time_now(void)
#define VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH
always_inline clib_error_t * elog_write_file(elog_main_t *em, char *unix_file)
always_inline vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
clib_error_t * vlib_call_all_config_functions(vlib_main_t *vm, unformat_input_t *input, int is_early)
clib_random_buffer_t random_buffer
clib_error_t * main_loop_error
elog_event_t * elog_peek_events(elog_main_t *em)
u64 cpu_time_last_node_dispatch
void vlib_gdb_show_event_log(void)
u32 vectors_since_last_overflow
vlib_frame_t * vlib_get_next_frame_internal(vlib_main_t *vm, vlib_node_runtime_t *node, u32 next_index, u32 allocate_new_next_frame)
#define VLIB_PROCESS_IS_RUNNING