session: interrupt mode for session node on main thread 75/31675/8
authorFlorin Coras <fcoras@cisco.com>
Thu, 18 Mar 2021 04:52:49 +0000 (21:52 -0700)
committerDave Barach <openvpp@barachs.net>
Tue, 30 Mar 2021 14:51:16 +0000 (14:51 +0000)
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

src/vnet/session/session.c

index c447557..c24a95f 100644 (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);
 }