session_send_evt_to_thread (void *data, void *args, u32 thread_index,
session_evt_type_t evt_type)
{
+ session_worker_t *wrk = session_main_get_worker (thread_index);
session_event_t *evt;
svm_msg_q_msg_t msg;
svm_msg_q_t *mq;
- mq = session_main_get_vpp_event_queue (thread_index);
+ mq = wrk->vpp_event_queue;
if (PREDICT_FALSE (svm_msg_q_lock (mq)))
return -1;
if (PREDICT_FALSE (svm_msg_q_is_full (mq)
evt->event_type = evt_type;
svm_msg_q_add_and_unlock (mq, &msg);
+
+ if (PREDICT_FALSE (wrk->state == SESSION_WRK_INTERRUPT))
+ vlib_node_set_interrupt_pending (wrk->vm, session_queue_node.index);
+
return 0;
}
void
session_add_self_custom_tx_evt (transport_connection_t * tc, u8 has_prio)
{
- session_t *s;
+ session_t *s = session_get (tc->s_index, tc->thread_index);
- s = session_get (tc->s_index, tc->thread_index);
ASSERT (s->thread_index == vlib_get_thread_index ());
ASSERT (s->session_state != SESSION_STATE_TRANSPORT_DELETED);
+
if (!(s->flags & SESSION_F_CUSTOM_TX))
{
s->flags |= SESSION_F_CUSTOM_TX;
if (svm_fifo_set_event (s->tx_fifo)
|| transport_connection_is_descheduled (tc))
{
- session_worker_t *wrk;
session_evt_elt_t *elt;
+ session_worker_t *wrk;
+
wrk = session_main_get_worker (tc->thread_index);
if (has_prio)
elt = session_evt_alloc_new (wrk);
elt->evt.session_index = tc->s_index;
elt->evt.event_type = SESSION_IO_EVT_TX;
tc->flags &= ~TRANSPORT_CONNECTION_F_DESCHED;
+
+ if (PREDICT_FALSE (wrk->state == SESSION_WRK_INTERRUPT))
+ vlib_node_set_interrupt_pending (wrk->vm,
+ session_queue_node.index);
}
}
}
elt = session_evt_alloc_new (wrk);
elt->evt.session_index = tc->s_index;
elt->evt.event_type = SESSION_IO_EVT_TX;
+
+ if (PREDICT_FALSE (wrk->state == SESSION_WRK_INTERRUPT))
+ vlib_node_set_interrupt_pending (wrk->vm, session_queue_node.index);
}
static void
clib_memset (&elt->evt, 0, sizeof (session_event_t));
elt->evt.session_handle = session_handle (s);
elt->evt.event_type = evt;
+
+ if (PREDICT_FALSE (wrk->state == SESSION_WRK_INTERRUPT))
+ vlib_node_set_interrupt_pending (wrk->vm, session_queue_node.index);
}
else
session_send_ctrl_evt_to_thread (s, evt);
s->connection_index, tep, is_lcl);
}
+int
+session_transport_attribute (session_t *s, u8 is_get,
+ transport_endpt_attr_t *attr)
+{
+ if (s->session_state < SESSION_STATE_READY)
+ return -1;
+
+ return transport_connection_attribute (session_get_transport_proto (s),
+ s->connection_index, s->thread_index,
+ is_get, attr);
+}
+
transport_connection_t *
listen_session_get_transport (session_t * s)
{
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_RUN_ON_MAIN, 0);
+ vlib_node_set_interrupt_pending (vm, session_queue_node.index);
}
static clib_error_t *
if (num_threads > 1)
clib_rwlock_init (&smm->wrk[i].peekers_rw_locks);
+
+ if (!smm->no_adaptive && smm->use_private_rx_mqs)
+ session_wrk_enable_adaptive_mode (wrk);
}
/* Allocate vpp event queues segment and queue */
void
session_node_enable_disable (u8 is_en)
{
+ u8 mstate = is_en ? VLIB_NODE_STATE_INTERRUPT : VLIB_NODE_STATE_DISABLED;
u8 state = is_en ? VLIB_NODE_STATE_POLLING : VLIB_NODE_STATE_DISABLED;
- vlib_thread_main_t *vtm = vlib_get_thread_main ();
- u8 have_workers = vtm->n_threads != 0;
+ session_main_t *sm = &session_main;
+ vlib_main_t *vm;
+ vlib_node_t *n;
+ int n_vlibs, i;
- foreach_vlib_main ()
+ n_vlibs = vlib_get_n_threads ();
+ for (i = 0; i < n_vlibs; i++)
{
- if (have_workers && ii == 0)
+ vm = vlib_get_main_by_index (i);
+ /* main thread with workers and not polling */
+ if (i == 0 && n_vlibs > 1)
{
+ vlib_node_set_state (vm, session_queue_node.index, mstate);
if (is_en)
{
- vlib_node_set_state (this_vlib_main,
- session_queue_process_node.index, state);
- vlib_node_t *n = vlib_get_node (
- this_vlib_main, session_queue_process_node.index);
- vlib_start_process (this_vlib_main, n->runtime_index);
+ vlib_node_set_state (vm, session_queue_process_node.index,
+ state);
+ n = vlib_get_node (vm, session_queue_process_node.index);
+ vlib_start_process (vm, n->runtime_index);
}
else
{
- vlib_process_signal_event_mt (this_vlib_main,
+ vlib_process_signal_event_mt (vm,
session_queue_process_node.index,
SESSION_Q_PROCESS_STOP, 0);
}
- if (!session_main.poll_main)
+ if (!sm->poll_main)
continue;
}
- vlib_node_set_state (this_vlib_main, session_queue_node.index, state);
+ vlib_node_set_state (vm, session_queue_node.index, state);
}
+
+ if (sm->use_private_rx_mqs)
+ application_enable_rx_mqs_nodes (is_en);
}
clib_error_t *
smm->is_enabled = 0;
smm->session_enable_asap = 0;
smm->poll_main = 0;
+ smm->use_private_rx_mqs = 0;
+ smm->no_adaptive = 0;
smm->session_baseva = HIGH_SEGMENT_BASEVA;
#if (HIGH_SEGMENT_BASEVA > (4ULL << 30))
appns_sapi_enable ();
else if (unformat (input, "poll-main"))
smm->poll_main = 1;
+ else if (unformat (input, "use-private-rx-mqs"))
+ smm->use_private_rx_mqs = 1;
+ else if (unformat (input, "no-adaptive"))
+ smm->no_adaptive = 1;
else
return clib_error_return (0, "unknown input `%U'",
format_unformat_error, input);