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 <fcoras@cisco.com>
Change-Id: I5efd393effc8dad65e4125a3d0ad1be6b7484cb7
This commit is contained in:
Florin Coras
2021-03-17 21:52:49 -07:00
committed by Dave Barach
parent 4f81d447bc
commit 1d2e38bb6e

View File

@@ -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);
}