From 41d5f541d37dc564565b3b29eb370b65bb5a9036 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Fri, 15 Jan 2021 13:49:33 -0800 Subject: svm session vcl: per app rx message queues Add option to use per app private segments for app to vpp message queues, as opposed to exposing internal message queues segment. When so configured, internal message queues are still polled by the session queue node but external app message queues are handled by a new input node (appsl-rx-mqs-input) that runs in interrupt state. Signaling of the node, when mqs receive new messages, is done through eventfds epolled by worker epoll input nodes. Type: feature Signed-off-by: Florin Coras Change-Id: Iffe8ce5a9944a56a14e6d0f492a850cb9e392d16 --- src/vnet/session/session_node.c | 50 ++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 25 deletions(-) (limited to 'src/vnet/session/session_node.c') diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c index ccf93cbbf61..f3713d00cd1 100644 --- a/src/vnet/session/session_node.c +++ b/src/vnet/session/session_node.c @@ -1399,19 +1399,35 @@ session_flush_pending_tx_buffers (session_worker_t * wrk, vec_reset_length (wrk->pending_tx_nexts); } +int +session_wrk_handle_mq (session_worker_t *wrk, svm_msg_q_t *mq) +{ + svm_msg_q_msg_t _msg, *msg = &_msg; + u32 i, n_to_dequeue = 0; + session_event_t *evt; + + n_to_dequeue = svm_msg_q_size (mq); + for (i = 0; i < n_to_dequeue; i++) + { + svm_msg_q_sub_raw (mq, msg); + evt = svm_msg_q_msg_data (mq, msg); + session_evt_add_to_list (wrk, evt); + svm_msg_q_free_msg (mq, msg); + } + + return n_to_dequeue; +} + static uword session_queue_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { + u32 thread_index = vm->thread_index, __clib_unused n_evts; + session_evt_elt_t *elt, *ctrl_he, *new_he, *old_he; session_main_t *smm = vnet_get_session_main (); - 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; - int i = 0, n_tx_packets; - session_event_t *evt; - svm_msg_q_t *mq; + int n_tx_packets; SESSION_EVT (SESSION_EVT_DISPATCH_START, wrk); @@ -1426,25 +1442,11 @@ session_queue_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, SESSION_EVT (SESSION_EVT_DSP_CNTRS, UPDATE_TIME, wrk); /* - * Dequeue and handle new events + * Dequeue new internal mq events */ - /* Try to dequeue what is available. Don't wait for lock. - * XXX: we may need priorities here */ - mq = wrk->vpp_event_queue; - n_to_dequeue = svm_msg_q_size (mq); - if (n_to_dequeue) - { - for (i = 0; i < n_to_dequeue; i++) - { - svm_msg_q_sub_raw (mq, msg); - evt = svm_msg_q_msg_data (mq, msg); - session_evt_add_to_list (wrk, evt); - svm_msg_q_free_msg (mq, msg); - } - } - - SESSION_EVT (SESSION_EVT_DSP_CNTRS, MQ_DEQ, wrk, n_to_dequeue, !i); + n_evts = session_wrk_handle_mq (wrk, wrk->vpp_event_queue); + SESSION_EVT (SESSION_EVT_DSP_CNTRS, MQ_DEQ, wrk, n_evts); /* * Handle control events @@ -1452,12 +1454,10 @@ session_queue_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, ctrl_he = pool_elt_at_index (wrk->event_elts, wrk->ctrl_head); - /* *INDENT-OFF* */ 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); })); - /* *INDENT-ON* */ SESSION_EVT (SESSION_EVT_DSP_CNTRS, CTRL_EVTS, wrk); -- cgit 1.2.3-korg