session: avoid scanning new io list under load
[vpp.git] / src / vnet / session / session_node.c
index a0f4f34..c357079 100644 (file)
@@ -501,7 +501,7 @@ format_session_queue_trace (u8 * s, va_list * args)
   CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
   session_queue_trace_t *t = va_arg (*args, session_queue_trace_t *);
 
-  s = format (s, "SESSION_QUEUE: session index %d, server thread index %d",
+  s = format (s, "session index %d thread index %d",
              t->session_index, t->server_thread_index);
   return s;
 }
@@ -543,7 +543,7 @@ session_tx_trace_frame (vlib_main_t * vm, vlib_node_runtime_t * node,
 
   for (i = 0; i < clib_min (n_trace, n_segs); i++)
     {
-      b = vlib_get_buffer (vm, to_next[i - n_segs]);
+      b = vlib_get_buffer (vm, to_next[i]);
       vlib_trace_buffer (vm, node, next_index, b, 1 /* follow_chain */ );
       t = vlib_add_trace (vm, node, b, sizeof (*t));
       t->session_index = s->session_index;
@@ -1257,8 +1257,8 @@ session_queue_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
   u32 thread_index = vm->thread_index, n_to_dequeue;
   session_worker_t *wrk = &smm->wrk[thread_index];
   session_evt_elt_t *elt, *ctrl_he, *new_he, *old_he;
+  clib_llist_index_t ei, next_ei, old_ti;
   svm_msg_q_msg_t _msg, *msg = &_msg;
-  clib_llist_index_t old_ti;
   int i, n_tx_packets = 0;
   session_event_t *evt;
   svm_msg_q_t *mq;
@@ -1314,24 +1314,14 @@ session_queue_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
   old_he = pool_elt_at_index (wrk->event_elts, wrk->old_head);
   old_ti = clib_llist_prev_index (old_he, evt_list);
 
-  /* *INDENT-OFF* */
-  clib_llist_foreach_safe (wrk->event_elts, evt_list, new_he, elt, ({
-    session_evt_type_t et;
-
-    et = elt->evt.event_type;
-    clib_llist_remove (wrk->event_elts, evt_list, elt);
-
-    /* Postpone tx events if we can't handle them this dispatch cycle */
-    if (n_tx_packets >= VLIB_FRAME_SIZE
-       && (et == SESSION_IO_EVT_TX || et == SESSION_IO_EVT_TX_FLUSH))
-      {
-       clib_llist_add (wrk->event_elts, evt_list, elt, new_he);
-       continue;
-      }
-
-    session_event_dispatch_io (wrk, node, elt, thread_index, &n_tx_packets);
-  }));
-  /* *INDENT-ON* */
+  ei = clib_llist_next_index (new_he, evt_list);
+  while (ei != wrk->new_head && n_tx_packets < VLIB_FRAME_SIZE)
+    {
+      elt = pool_elt_at_index (wrk->event_elts, ei);
+      ei = clib_llist_next_index (elt, evt_list);
+      clib_llist_remove (wrk->event_elts, evt_list, elt);
+      session_event_dispatch_io (wrk, node, elt, thread_index, &n_tx_packets);
+    }
 
   /*
    * Handle the old io events, if we had any prior to processing the new ones
@@ -1339,8 +1329,6 @@ session_queue_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
 
   if (old_ti != wrk->old_head)
     {
-      clib_llist_index_t ei, next_ei;
-
       old_he = pool_elt_at_index (wrk->event_elts, wrk->old_head);
       ei = clib_llist_next_index (old_he, evt_list);