From 1d2e38bb6ec0841d3e64be562c669c6ea3db764f Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Wed, 17 Mar 2021 21:52:49 -0700 Subject: session: interrupt mode for session node on main thread Signal, and implicitly run, main thread session queue node via interrupts instead of the queue process node. Process node still needed for timers. Type: improvement Signed-off-by: Florin Coras Change-Id: I5efd393effc8dad65e4125a3d0ad1be6b7484cb7 --- src/vnet/session/session.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c index c447557f8b0..c24a95fd9a6 100644 --- a/src/vnet/session/session.c +++ b/src/vnet/session/session.c @@ -1656,8 +1656,7 @@ void session_queue_run_on_main_thread (vlib_main_t * vm) { ASSERT (vlib_get_thread_index () == 0); - vlib_process_signal_event_mt (vm, session_queue_process_node.index, - SESSION_Q_PROCESS_RUN_ON_MAIN, 0); + vlib_node_set_interrupt_pending (vm, session_queue_node.index); } static clib_error_t * @@ -1749,35 +1748,41 @@ session_manager_main_disable (vlib_main_t * vm) void session_node_enable_disable (u8 is_en) { + u8 mstate = is_en ? VLIB_NODE_STATE_INTERRUPT : VLIB_NODE_STATE_DISABLED; u8 state = is_en ? VLIB_NODE_STATE_POLLING : VLIB_NODE_STATE_DISABLED; - vlib_thread_main_t *vtm = vlib_get_thread_main (); - u8 have_workers = vtm->n_threads != 0; + session_main_t *sm = &session_main; + vlib_main_t *vm; + vlib_node_t *n; + int n_vlibs, i; - foreach_vlib_main () + n_vlibs = vlib_get_n_threads (); + for (i = 0; i < n_vlibs; i++) { - if (have_workers && ii == 0) + vm = vlib_get_main_by_index (i); + /* main thread with workers and not polling */ + if (i == 0 && n_vlibs > 1) { + vlib_node_set_state (vm, session_queue_node.index, mstate); if (is_en) { - vlib_node_set_state (this_vlib_main, - session_queue_process_node.index, state); - vlib_node_t *n = vlib_get_node ( - this_vlib_main, session_queue_process_node.index); - vlib_start_process (this_vlib_main, n->runtime_index); + vlib_node_set_state (vm, session_queue_process_node.index, + state); + n = vlib_get_node (vm, session_queue_process_node.index); + vlib_start_process (vm, n->runtime_index); } else { - vlib_process_signal_event_mt (this_vlib_main, + vlib_process_signal_event_mt (vm, session_queue_process_node.index, SESSION_Q_PROCESS_STOP, 0); } - if (!session_main.poll_main) + if (!sm->poll_main) continue; } - vlib_node_set_state (this_vlib_main, session_queue_node.index, state); + vlib_node_set_state (vm, session_queue_node.index, state); } - if (session_main.use_private_rx_mqs) + if (sm->use_private_rx_mqs) application_enable_rx_mqs_nodes (is_en); } -- cgit 1.2.3-korg