49 return vec_cmp (n1[0]->name, n2[0]->name);
75 for (i = 0; i <
vec_len (nodes); i++)
85 .path =
"show vlib graph",
86 .short_help =
"Show packet processing node graph",
94 int max = va_arg (*va,
int);
109 "%=30s%=17s%=16s%=16s%=16s%=16s",
110 "Name",
"Max Node Clocks",
"Vectors at Max",
"Max Clocks",
"Avg Clocks",
"Avg Vectors/Call");
113 "%=30s%=12s%=16s%=16s%=16s%=16s%=16s",
114 "Name",
"State",
"Calls",
"Vectors",
"Suspends",
"Clocks",
"Vectors/Call");
140 v = (double)p / (
double)c;
152 misc_info =
format (misc_info,
"events pending, ");
167 state =
"event wait";
179 if (n->
state == VLIB_NODE_STATE_DISABLED)
181 else if (n->
state == VLIB_NODE_STATE_INTERRUPT)
182 state =
"interrupt wait";
188 s =
format (s,
"%-30v%=17.2e%=16d%=16.2e%=16.2e%=16.2e",
189 ns, maxc, maxn, maxcn, x, v);
191 s =
format (s,
"%-30v%=12s%16Ld%16Ld%16Ld%16.2e%16.2f", ns, state,
216 f64 * vectors_per_main_loop = 0;
217 f64 * last_vector_length_per_node = 0;
233 u64 n_input, n_output, n_drop, n_punt;
234 u64 n_internal_vectors, n_internal_calls;
235 u64 n_clocks, l, v, c, d;
266 for (j = 0; j <
vec_len (stat_vms); j++)
268 stat_vm = stat_vms[j];
269 nm = &stat_vm->node_main;
282 vec_add1 (last_vector_length_per_node,
288 for (j = 0; j <
vec_len (stat_vms); j++)
290 stat_vm = stat_vms[j];
291 nodes = node_dups[j];
295 n_input = n_output = n_drop = n_punt = n_clocks = 0;
296 n_internal_vectors = n_internal_calls = 0;
297 for (i = 0; i <
vec_len (nodes); i++)
318 n_internal_vectors += v;
319 n_internal_calls += c;
348 "Time %.1f, average vectors/node %.2f, last %d main loops %.2f per node %.2f" 349 "\n vector rates in %.4e, out %.4e, drop %.4e, punt %.4e",
351 (n_internal_calls > 0
352 ? (
f64) n_internal_vectors / (
f64) n_internal_calls
355 vectors_per_main_loop [j],
356 last_vector_length_per_node [j],
363 for (i = 0; i <
vec_len (nodes); i++)
367 if (c || d || ! brief)
378 vec_free (last_vector_length_per_node);
385 .path =
"show runtime",
386 .short_help =
"Show packet processing runtime",
416 for (j = 0; j <
vec_len (stat_vms); j++)
418 stat_vm = stat_vms[j];
419 nm = &stat_vm->node_main;
442 .path =
"clear runtime",
443 .short_help =
"Clear packet processing runtime statistics",
sll srl srl sll sra u16x4 i
always_inline vlib_node_t * vlib_get_node(vlib_main_t *vm, u32 i)
always_inline f64 vlib_last_vectors_per_main_loop_as_f64(vlib_main_t *vm)
static int node_cmp(void *a1, void *a2)
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
vlib_node_stats_t stats_last_clear
static clib_error_t * show_node_runtime(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define VLIB_NODE_FLAG_IS_DROP
#define VLIB_LOG2_MAIN_LOOPS_PER_STATS_UPDATE
static u8 * format_vlib_node_stats(u8 *s, va_list *va)
vlib_node_stats_t stats_total
#define VLIB_NODE_FLAG_IS_HANDOFF
f64 time_last_runtime_stats_clear
#define vec_dup(V)
Return copy of vector (no header, no alignment)
always_inline f64 vlib_last_vector_length_per_node(vlib_main_t *vm)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
#define vec_free(V)
Free vector's memory (no header).
#define VLIB_CLI_COMMAND(x,...)
vlib_worker_thread_t * vlib_worker_threads
#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)
#define VLIB_NODE_FLAG_IS_PUNT
static clib_error_t * clear_node_runtime(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
void vlib_node_cli_reference(void)
vhost_vring_state_t state
#define vec_cmp(v1, v2)
Compare two vectors (only applicable to vectors of signed numbers).
void vlib_worker_thread_barrier_release(vlib_main_t *vm)
always_inline uword clib_bitmap_is_zero(uword *ai)
#define VLIB_NODE_FLAG_IS_OUTPUT
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
vlib_node_main_t node_main
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
static clib_error_t * show_node_graph(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_CLOCK
unformat_function_t unformat_vlib_node
void vlib_node_sync_stats(vlib_main_t *vm, vlib_node_t *n)
always_inline vlib_node_runtime_t * vlib_node_get_runtime(vlib_main_t *vm, u32 node_index)
always_inline f64 vlib_time_now(vlib_main_t *vm)
format_function_t format_vlib_node_graph
vlib_main_t ** vlib_mains
#define VLIB_PROCESS_IS_RUNNING
uword * non_empty_event_type_bitmap