diff options
Diffstat (limited to 'src/vnet/session')
-rw-r--r-- | src/vnet/session/session.c | 4 | ||||
-rw-r--r-- | src/vnet/session/session.h | 21 | ||||
-rw-r--r-- | src/vnet/session/session_node.c | 23 |
3 files changed, 33 insertions, 15 deletions
diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c index fa4cd85e5e4..ce3f581a263 100644 --- a/src/vnet/session/session.c +++ b/src/vnet/session/session.c @@ -1548,11 +1548,11 @@ listen_session_get_transport (session_t * s) } void -session_flush_frames_main_thread (vlib_main_t * vm) +session_queue_run_on_main_thread (vlib_main_t * vm) { ASSERT (vlib_get_thread_index () == 0); vlib_process_signal_event_mt (vm, session_queue_process_node.index, - SESSION_Q_PROCESS_FLUSH_FRAMES, 0); + SESSION_Q_PROCESS_RUN_ON_MAIN, 0); } static clib_error_t * diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h index d72763a73ce..681b42d868d 100644 --- a/src/vnet/session/session.h +++ b/src/vnet/session/session.h @@ -202,8 +202,11 @@ extern vlib_node_registration_t session_queue_node; extern vlib_node_registration_t session_queue_process_node; extern vlib_node_registration_t session_queue_pre_input_node; -#define SESSION_Q_PROCESS_FLUSH_FRAMES 1 -#define SESSION_Q_PROCESS_STOP 2 +typedef enum session_q_process_evt_ +{ + SESSION_Q_PROCESS_RUN_ON_MAIN = 1, + SESSION_Q_PROCESS_STOP +} session_q_process_evt_t; #define TRANSPORT_PROTO_INVALID (session_main.last_transport_proto_type + 1) #define TRANSPORT_N_PROTOS (session_main.last_transport_proto_type + 1) @@ -641,14 +644,22 @@ do { \ int session_main_flush_enqueue_events (u8 proto, u32 thread_index); int session_main_flush_all_enqueue_events (u8 transport_proto); -void session_flush_frames_main_thread (vlib_main_t * vm); +void session_queue_run_on_main_thread (vlib_main_t * vm); +/** + * Add session node pending buffer with custom node + * + * @param thread_index worker thread expected to send the buffer + * @param bi buffer index + * @param next_node next node edge index for buffer. Edge to next node + * must exist + */ always_inline void -session_add_pending_tx_buffer (session_type_t st, u32 thread_index, u32 bi) +session_add_pending_tx_buffer (u32 thread_index, u32 bi, u32 next_node) { session_worker_t *wrk = session_main_get_worker (thread_index); vec_add1 (wrk->pending_tx_buffers, bi); - vec_add1 (wrk->pending_tx_nexts, session_main.session_type_to_next[st]); + vec_add1 (wrk->pending_tx_nexts, next_node); } ssvm_private_t *session_main_get_evt_q_segment (void); diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c index b5f4321c9a8..2a4bb6b9425 100644 --- a/src/vnet/session/session_node.c +++ b/src/vnet/session/session_node.c @@ -1564,32 +1564,39 @@ session_queue_exit (vlib_main_t * vm) VLIB_MAIN_LOOP_EXIT_FUNCTION (session_queue_exit); static uword +session_queue_run_on_main (vlib_main_t * vm) +{ + vlib_node_runtime_t *node; + + node = vlib_node_get_runtime (vm, session_queue_node.index); + return session_queue_node_fn (vm, node, 0); +} + +static uword session_queue_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) { - f64 now, timeout = 1.0; uword *event_data = 0; + f64 timeout = 1.0; uword event_type; while (1) { vlib_process_wait_for_event_or_clock (vm, timeout); - now = vlib_time_now (vm); event_type = vlib_process_get_events (vm, (uword **) & event_data); switch (event_type) { - case SESSION_Q_PROCESS_FLUSH_FRAMES: - /* Flush the frames by updating all transports times */ - transport_update_time (now, 0); + case SESSION_Q_PROCESS_RUN_ON_MAIN: + /* Run session queue node on main thread */ + session_queue_run_on_main (vm); break; case SESSION_Q_PROCESS_STOP: timeout = 100000.0; break; case ~0: - /* Timed out. Update time for all transports to trigger all - * outstanding retransmits. */ - transport_update_time (now, 0); + /* Timed out. Run on main to ensure all events are handled */ + session_queue_run_on_main (vm); break; } vec_reset_length (event_data); |