summaryrefslogtreecommitdiffstats
path: root/src/vnet/session/session.h
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2021-03-18 15:04:34 -0700
committerDamjan Marion <dmarion@me.com>2021-04-06 11:15:38 +0000
commit7da8829d8152ef5105a57231fd1d91700e9b4f6c (patch)
tree56d4014ec34ec377ae06a08150a962d855c3a170 /src/vnet/session/session.h
parentd82349ecad23bfd80e9a518f595adf78f363c68d (diff)
session: basic support for interrupt mode
Experimental support for session layer interrupt mode. When enabled (use-private-rx-mqs must be set) session queue node switches to interrupt state when lightly loaded, i.e., no events and less than 1 vector/dispatch. Because transport protocols require a periodic time update, when in interrupt state the session queue node workers register a timerfd with the unix-epoll-input node that when triggered signals, i.e., wakes up, the queue node. Under light load, the timer is set to trigger every 1ms whereas if no session is allocated, the worker moves to idle state and the timeout is set to 100ms. Type: feature Signed-off-by: Florin Coras <fcoras@cisco.com> Change-Id: I905b00777fbc025faf9c4074fce4c516cd139387
Diffstat (limited to 'src/vnet/session/session.h')
-rw-r--r--src/vnet/session/session.h30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h
index 55863163a89..93278d6c3e1 100644
--- a/src/vnet/session/session.h
+++ b/src/vnet/session/session.h
@@ -69,6 +69,18 @@ typedef struct session_ctrl_evt_data_
u8 data[SESSION_CTRL_MSG_MAX_SIZE];
} session_evt_ctrl_data_t;
+typedef enum session_wrk_state_
+{
+ SESSION_WRK_POLLING,
+ SESSION_WRK_INTERRUPT,
+ SESSION_WRK_IDLE,
+} __clib_packed session_wrk_state_t;
+
+typedef enum session_wrk_flags_
+{
+ SESSION_WRK_F_ADAPTIVE = 1 << 0,
+} __clib_packed session_wrk_flag_t;
+
typedef struct session_worker_
{
CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
@@ -91,6 +103,15 @@ typedef struct session_worker_
/** Per-proto vector of sessions to enqueue */
u32 **session_to_enqueue;
+ /** Timerfd used to periodically signal wrk session queue node */
+ u32 timerfd;
+
+ /** Worker flags */
+ session_wrk_flag_t flags;
+
+ /** Worker state */
+ session_wrk_state_t state;
+
/** Context for session tx */
session_tx_context_t ctx;
@@ -121,6 +142,9 @@ typedef struct session_worker_
/** Vector of nexts for the pending tx buffers */
u16 *pending_tx_nexts;
+ /** Clib file for timerfd. Used only if adaptive mode is on */
+ uword timerfd_file;
+
#if SESSION_DEBUG
/** last event poll time by thread */
clib_time_type_t last_event_poll;
@@ -177,6 +201,9 @@ typedef struct session_main_
/** Allocate private rx mqs for external apps */
u8 use_private_rx_mqs;
+ /** Do not enable session queue node adaptive mode */
+ u8 no_adaptive;
+
/** vpp fifo event queue configured length */
u32 configured_event_queue_length;
@@ -682,6 +709,8 @@ 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, next_node);
+ if (PREDICT_FALSE (wrk->state == SESSION_WRK_INTERRUPT))
+ vlib_node_set_interrupt_pending (wrk->vm, session_queue_node.index);
}
always_inline void
@@ -691,6 +720,7 @@ session_wrk_update_time (session_worker_t *wrk, f64 now)
wrk->last_vlib_us_time = wrk->last_vlib_time * CLIB_US_TIME_FREQ;
}
+void session_wrk_enable_adaptive_mode (session_worker_t *wrk);
fifo_segment_t *session_main_get_evt_q_segment (void);
void session_node_enable_disable (u8 is_en);
clib_error_t *vnet_session_enable_disable (vlib_main_t * vm, u8 is_en);