session: only handle old ctrl events per dispatch 52/32352/4
authorFlorin Coras <fcoras@cisco.com>
Mon, 17 May 2021 23:05:41 +0000 (16:05 -0700)
committerDamjan Marion <dmarion@me.com>
Tue, 18 May 2021 08:29:28 +0000 (08:29 +0000)
Avoids dispatching ctrl events generated while handling the
current pending list.

Type: improvement

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Ibeaf901ba4cf58a68fbd88e5ec3c23f6c2f6f145

src/vnet/session/session_node.c

index fa66119..a0b566e 100644 (file)
@@ -1689,12 +1689,18 @@ session_queue_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
    * Handle control events
    */
 
-  ctrl_he = pool_elt_at_index (wrk->event_elts, wrk->ctrl_head);
-
-  clib_llist_foreach_safe (wrk->event_elts, evt_list, ctrl_he, elt, ({
-    clib_llist_remove (wrk->event_elts, evt_list, elt);
-    session_event_dispatch_ctrl (wrk, elt);
-  }));
+  ei = wrk->ctrl_head;
+  ctrl_he = pool_elt_at_index (wrk->event_elts, ei);
+  next_ei = clib_llist_next_index (ctrl_he, evt_list);
+  old_ti = clib_llist_prev_index (ctrl_he, evt_list);
+  while (ei != old_ti)
+    {
+      ei = next_ei;
+      elt = pool_elt_at_index (wrk->event_elts, next_ei);
+      next_ei = clib_llist_next_index (elt, evt_list);
+      clib_llist_remove (wrk->event_elts, evt_list, elt);
+      session_event_dispatch_ctrl (wrk, elt);
+    }
 
   SESSION_EVT (SESSION_EVT_DSP_CNTRS, CTRL_EVTS, wrk);