From 09843951dc200f4bf52e0e09a9a63a477fa6c3b1 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Mon, 17 May 2021 16:05:41 -0700 Subject: session: only handle old ctrl events per dispatch Avoids dispatching ctrl events generated while handling the current pending list. Type: improvement Signed-off-by: Florin Coras Change-Id: Ibeaf901ba4cf58a68fbd88e5ec3c23f6c2f6f145 --- src/vnet/session/session_node.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'src/vnet') diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c index fa66119abe2..a0b566e5a51 100644 --- a/src/vnet/session/session_node.c +++ b/src/vnet/session/session_node.c @@ -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); -- cgit 1.2.3-korg