diff options
Diffstat (limited to 'src/vnet/session/session_debug.c')
-rw-r--r-- | src/vnet/session/session_debug.c | 125 |
1 files changed, 100 insertions, 25 deletions
diff --git a/src/vnet/session/session_debug.c b/src/vnet/session/session_debug.c index 349d1ec9b46..2a50adac5dd 100644 --- a/src/vnet/session/session_debug.c +++ b/src/vnet/session/session_debug.c @@ -52,15 +52,20 @@ show_session_dbg_clock_cycles_fn (vlib_main_t * vm, unformat_input_t * input, } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_session_dbg_clock_cycles_command, static) = { .path = "show session dbg clock_cycles", .short_help = "show session dbg clock_cycles", .function = show_session_dbg_clock_cycles_fn, }; -/* *INDENT-ON* */ +static_always_inline f64 +session_dbg_time_now (u32 thread) +{ + vlib_main_t *vm = vlib_get_main_by_index (thread); + + return clib_time_now (&vm->clib_time) + vm->time_offset; +} static clib_error_t * clear_session_dbg_clock_cycles_fn (vlib_main_t * vm, unformat_input_t * input, @@ -77,7 +82,7 @@ clear_session_dbg_clock_cycles_fn (vlib_main_t * vm, unformat_input_t * input, { sde = &session_dbg_main.wrk[thread]; clib_memset (sde, 0, sizeof (session_dbg_evts_t)); - sde->last_time = vlib_time_now (vlib_mains[thread]); + sde->last_time = session_dbg_time_now (thread); sde->start_time = sde->last_time; } @@ -85,14 +90,12 @@ clear_session_dbg_clock_cycles_fn (vlib_main_t * vm, unformat_input_t * input, } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (clear_session_clock_cycles_command, static) = { .path = "clear session dbg clock_cycles", .short_help = "clear session dbg clock_cycles", .function = clear_session_dbg_clock_cycles_fn, }; -/* *INDENT-ON* */ void session_debug_init (void) @@ -107,15 +110,99 @@ session_debug_init (void) for (thread = 0; thread < num_threads; thread++) { clib_memset (&sdm->wrk[thread], 0, sizeof (session_dbg_evts_t)); - sdm->wrk[thread].start_time = vlib_time_now (vlib_mains[thread]); + sdm->wrk[thread].start_time = session_dbg_time_now (thread); + } +} + +static const char *session_evt_grp_str[] = { +#define _(sym, str) str, + foreach_session_evt_grp +#undef _ +}; + +static void +session_debug_show_groups (vlib_main_t *vm) +{ + session_dbg_main_t *sdm = &session_dbg_main; + int i = 0; + + vlib_cli_output (vm, "%-10s%-30s%-10s", "Index", "Group", "Level"); + + for (i = 0; i < SESSION_EVT_N_GRP; i++) + vlib_cli_output (vm, "%-10d%-30s%-10d", i, session_evt_grp_str[i], + sdm->grp_dbg_lvl[i]); +} + +static clib_error_t * +session_debug_fn (vlib_main_t *vm, unformat_input_t *input, + vlib_cli_command_t *cmd) +{ + session_dbg_main_t *sdm = &session_dbg_main; + u32 group, level = ~0; + clib_error_t *error = 0; + u8 is_show = 0; + uword *bitmap = 0; + + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "show")) + is_show = 1; + else if (unformat (input, "group %U", unformat_bitmap_list, &bitmap)) + ; + else if (unformat (input, "level %d", &level)) + ; + else + { + error = clib_error_return (0, "unknown input `%U'", + format_unformat_error, input); + goto done; + } + } + + if (is_show) + { + session_debug_show_groups (vm); + goto done; + } + if (level == ~0) + { + vlib_cli_output (vm, "level must be entered"); + goto done; + } + + group = clib_bitmap_last_set (bitmap); + if (group == ~0) + { + vlib_cli_output (vm, "group must be entered"); + goto done; + } + if (group >= SESSION_EVT_N_GRP) + { + vlib_cli_output (vm, "group out of bounds"); + goto done; } + clib_bitmap_foreach (group, bitmap) + sdm->grp_dbg_lvl[group] = level; + +done: + + clib_bitmap_free (bitmap); + return error; } + +VLIB_CLI_COMMAND (session_debug_command, static) = { + .path = "session debug", + .short_help = "session debug {show | debug group <list> level <n>}", + .function = session_debug_fn, + .is_mp_safe = 1, +}; + #else void session_debug_init (void) { } -#endif +#endif /* SESSION_DEBUG */ void dump_thread_0_event_queue (void) @@ -144,6 +231,8 @@ dump_thread_0_event_queue (void) { case SESSION_IO_EVT_TX: s0 = session_get_if_valid (e->session_index, my_thread_index); + if (!s0) + break; fformat (stdout, "[%04d] TX session %d\n", i, s0->session_index); break; @@ -155,6 +244,8 @@ dump_thread_0_event_queue (void) case SESSION_IO_EVT_BUILTIN_RX: s0 = session_get_if_valid (e->session_index, my_thread_index); + if (!s0) + break; fformat (stdout, "[%04d] builtin_rx %d\n", i, s0->session_index); break; @@ -180,28 +271,18 @@ dump_thread_0_event_queue (void) static u8 session_node_cmp_event (session_event_t * e, svm_fifo_t * f) { - session_t *s; switch (e->event_type) { case SESSION_IO_EVT_RX: case SESSION_IO_EVT_TX: case SESSION_IO_EVT_BUILTIN_RX: - case SESSION_IO_EVT_BUILTIN_TX: + case SESSION_IO_EVT_TX_MAIN: case SESSION_IO_EVT_TX_FLUSH: if (e->session_index == f->shr->master_session_index) return 1; break; case SESSION_CTRL_EVT_CLOSE: - break; case SESSION_CTRL_EVT_RPC: - s = session_get_from_handle (e->session_handle); - if (!s) - { - clib_warning ("session has event but doesn't exist!"); - break; - } - if (s->rx_fifo == f || s->tx_fifo == f) - return 1; break; default: break; @@ -217,7 +298,6 @@ session_node_lookup_fifo_event (svm_fifo_t * f, session_event_t * e) session_worker_t *wrk; int i, index, found = 0; svm_msg_q_msg_t *msg; - svm_msg_q_ring_t *ring; svm_msg_q_t *mq; u8 thread_index; @@ -234,8 +314,7 @@ session_node_lookup_fifo_event (svm_fifo_t * f, session_event_t * e) for (i = 0; i < sq->cursize; i++) { msg = (svm_msg_q_msg_t *) (&sq->data[0] + sq->elsize * index); - ring = svm_msg_q_ring (mq, msg->ring_index); - clib_memcpy_fast (e, svm_msg_q_msg_data (mq, msg), ring->elsize); + clib_memcpy_fast (e, svm_msg_q_msg_data (mq, msg), sizeof (*e)); found = session_node_cmp_event (e, f); if (found) return 1; @@ -245,7 +324,6 @@ session_node_lookup_fifo_event (svm_fifo_t * f, session_event_t * e) * Search pending events vector */ - /* *INDENT-OFF* */ clib_llist_foreach (wrk->event_elts, evt_list, pool_elt_at_index (wrk->event_elts, wrk->new_head), elt, ({ @@ -256,9 +334,7 @@ session_node_lookup_fifo_event (svm_fifo_t * f, session_event_t * e) goto done; } })); - /* *INDENT-ON* */ - /* *INDENT-OFF* */ clib_llist_foreach (wrk->event_elts, evt_list, pool_elt_at_index (wrk->event_elts, wrk->old_head), elt, ({ @@ -269,7 +345,6 @@ session_node_lookup_fifo_event (svm_fifo_t * f, session_event_t * e) goto done; } })); - /* *INDENT-ON* */ done: return found; |