vhost: support interrupt mode
[vpp.git] / src / vlib / main.c
index 9176070..50f0b16 100644 (file)
@@ -1017,6 +1017,7 @@ dispatch_node (vlib_main_t * vm,
              && (node->flags
                  & VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE)))
        {
+#ifdef DISPATCH_NODE_ELOG_REQUIRED
          ELOG_TYPE_DECLARE (e) =
          {
            .function = (char *) __FUNCTION__,.format =
@@ -1028,16 +1029,17 @@ dispatch_node (vlib_main_t * vm,
          {
            u32 node_name, vector_length, is_polling;
          } *ed;
+         vlib_worker_thread_t *w = vlib_worker_threads + vm->cpu_index;
+#endif
 
-         if (dispatch_state == VLIB_NODE_STATE_INTERRUPT
-             && v >= nm->polling_threshold_vector_length)
+         if ((dispatch_state == VLIB_NODE_STATE_INTERRUPT
+              && v >= nm->polling_threshold_vector_length) &&
+             !(node->flags &
+               VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE))
            {
              vlib_node_t *n = vlib_get_node (vm, node->node_index);
              n->state = VLIB_NODE_STATE_POLLING;
              node->state = VLIB_NODE_STATE_POLLING;
-             ASSERT (!
-                     (node->flags &
-                      VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE));
              node->flags &=
                ~VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE;
              node->flags |=
@@ -1045,10 +1047,13 @@ dispatch_node (vlib_main_t * vm,
              nm->input_node_counts_by_state[VLIB_NODE_STATE_INTERRUPT] -= 1;
              nm->input_node_counts_by_state[VLIB_NODE_STATE_POLLING] += 1;
 
-             ed = ELOG_DATA (&vm->elog_main, e);
+#ifdef DISPATCH_NODE_ELOG_REQUIRED
+             ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e,
+                                   w->elog_track);
              ed->node_name = n->name_elog_string;
              ed->vector_length = v;
              ed->is_polling = 1;
+#endif
            }
          else if (dispatch_state == VLIB_NODE_STATE_POLLING
                   && v <= nm->interrupt_threshold_vector_length)
@@ -1073,10 +1078,13 @@ dispatch_node (vlib_main_t * vm,
                {
                  node->flags |=
                    VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE;
-                 ed = ELOG_DATA (&vm->elog_main, e);
+#ifdef DISPATCH_NODE_ELOG_REQUIRED
+                 ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e,
+                                       w->elog_track);
                  ed->node_name = n->name_elog_string;
                  ed->vector_length = v;
                  ed->is_polling = 0;
+#endif
                }
            }
        }
@@ -1436,6 +1444,10 @@ vlib_main_or_worker_loop (vlib_main_t * vm, int is_main)
 
   /* Pre-allocate expired nodes. */
   vec_alloc (nm->pending_interrupt_node_runtime_indices, 32);
+  if (!nm->polling_threshold_vector_length)
+    nm->polling_threshold_vector_length = 10;
+  if (!nm->interrupt_threshold_vector_length)
+    nm->interrupt_threshold_vector_length = 5;
 
   if (is_main)
     {
@@ -1468,12 +1480,13 @@ vlib_main_or_worker_loop (vlib_main_t * vm, int is_main)
        }
 
       /* Process pre-input nodes. */
-      vec_foreach (n, nm->nodes_by_type[VLIB_NODE_TYPE_PRE_INPUT])
-       cpu_time_now = dispatch_node (vm, n,
-                                     VLIB_NODE_TYPE_PRE_INPUT,
-                                     VLIB_NODE_STATE_POLLING,
-                                     /* frame */ 0,
-                                     cpu_time_now);
+      if (is_main)
+       vec_foreach (n, nm->nodes_by_type[VLIB_NODE_TYPE_PRE_INPUT])
+         cpu_time_now = dispatch_node (vm, n,
+                                       VLIB_NODE_TYPE_PRE_INPUT,
+                                       VLIB_NODE_STATE_POLLING,
+                                       /* frame */ 0,
+                                       cpu_time_now);
 
       /* Next process input nodes. */
       vec_foreach (n, nm->nodes_by_type[VLIB_NODE_TYPE_INPUT])