session: improve wrk mq segment allocation

Type: improvement

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I9e5438a2f82762aa8a88bbacf4290151ef30969e
This commit is contained in:
Florin Coras
2021-11-17 23:38:54 -08:00
committed by Dave Barach
parent b28652ed7a
commit 8afe1b8895
3 changed files with 62 additions and 53 deletions

View File

@ -1648,64 +1648,65 @@ session_transport_cleanup (session_t * s)
}
/**
* Allocate event queues in the shared-memory segment
* Allocate worker mqs in share-able segment
*
* That can only be a newly created memfd segment, that must be
* mapped by all apps/stack users.
* That can only be a newly created memfd segment, that must be mapped
* by all apps/stack users unless private rx mqs are enabled.
*/
void
session_vpp_event_queues_allocate (session_main_t * smm)
session_vpp_wrk_mqs_alloc (session_main_t *smm)
{
u32 evt_q_length = 2048, evt_size = sizeof (session_event_t);
fifo_segment_t *eqs = &smm->evt_qs_segment;
uword eqs_size = 64 << 20;
pid_t vpp_pid = getpid ();
u32 mq_q_length = 2048, evt_size = sizeof (session_event_t);
fifo_segment_t *mqs_seg = &smm->wrk_mqs_segment;
svm_msg_q_cfg_t _cfg, *cfg = &_cfg;
uword mqs_seg_size;
int i;
if (smm->configured_event_queue_length)
evt_q_length = smm->configured_event_queue_length;
mq_q_length = clib_max (mq_q_length, smm->configured_wrk_mq_length);
if (smm->evt_qs_segment_size)
eqs_size = smm->evt_qs_segment_size;
svm_msg_q_ring_cfg_t rc[SESSION_MQ_N_RINGS] = {
{ mq_q_length, evt_size, 0 }, { mq_q_length >> 1, 256, 0 }
};
cfg->consumer_pid = 0;
cfg->n_rings = 2;
cfg->q_nitems = mq_q_length;
cfg->ring_cfgs = rc;
eqs->ssvm.ssvm_size = eqs_size;
eqs->ssvm.my_pid = vpp_pid;
eqs->ssvm.name = format (0, "%s%c", "session: evt-qs-segment", 0);
/*
* Compute mqs segment size based on rings config and leave space
* for passing extended configuration messages, i.e., data allocated
* outside of the rings. If provided with a config value, accept it
* if larger than minimum size.
*/
mqs_seg_size = svm_msg_q_size_to_alloc (cfg) * vec_len (smm->wrk);
mqs_seg_size = mqs_seg_size + (32 << 10);
mqs_seg_size = clib_max (mqs_seg_size, smm->wrk_mqs_segment_size);
mqs_seg->ssvm.ssvm_size = mqs_seg_size;
mqs_seg->ssvm.my_pid = getpid ();
mqs_seg->ssvm.name = format (0, "%s%c", "session: wrk-mqs-segment", 0);
/* clib_mem_vm_map_shared consumes first page before requested_va */
eqs->ssvm.requested_va = smm->session_baseva + clib_mem_get_page_size ();
mqs_seg->ssvm.requested_va = smm->session_baseva + clib_mem_get_page_size ();
if (ssvm_server_init (&eqs->ssvm, SSVM_SEGMENT_MEMFD))
if (ssvm_server_init (&mqs_seg->ssvm, SSVM_SEGMENT_MEMFD))
{
clib_warning ("failed to initialize queue segment");
return;
}
fifo_segment_init (eqs);
fifo_segment_init (mqs_seg);
/* Special fifo segment that's filled only with mqs */
eqs->h->n_mqs = vec_len (smm->wrk);
mqs_seg->h->n_mqs = vec_len (smm->wrk);
for (i = 0; i < vec_len (smm->wrk); i++)
{
svm_msg_q_cfg_t _cfg, *cfg = &_cfg;
svm_msg_q_ring_cfg_t rc[SESSION_MQ_N_RINGS] = {
{evt_q_length, evt_size, 0}
,
{evt_q_length >> 1, 256, 0}
};
cfg->consumer_pid = 0;
cfg->n_rings = 2;
cfg->q_nitems = evt_q_length;
cfg->ring_cfgs = rc;
smm->wrk[i].vpp_event_queue = fifo_segment_msg_q_alloc (eqs, i, cfg);
}
smm->wrk[i].vpp_event_queue = fifo_segment_msg_q_alloc (mqs_seg, i, cfg);
}
fifo_segment_t *
session_main_get_evt_q_segment (void)
session_main_get_wrk_mqs_segment (void)
{
return &session_main.evt_qs_segment;
return &session_main.wrk_mqs_segment;
}
u64
@ -1862,7 +1863,7 @@ session_manager_main_enable (vlib_main_t * vm)
}
/* Allocate vpp event queues segment and queue */
session_vpp_event_queues_allocate (smm);
session_vpp_wrk_mqs_alloc (smm);
/* Initialize segment manager properties */
segment_manager_main_init ();
@ -1989,10 +1990,9 @@ session_main_init (vlib_main_t * vm)
#if (HIGH_SEGMENT_BASEVA > (4ULL << 30))
smm->session_va_space_size = 128ULL << 30;
smm->evt_qs_segment_size = 64 << 20;
#else
smm->session_va_space_size = 128 << 20;
smm->evt_qs_segment_size = 1 << 20;
smm->wrk_mqs_segment_size = 1 << 20;
#endif
smm->last_transport_proto_type = TRANSPORT_PROTO_SRTP;
@ -2025,10 +2025,10 @@ session_config_fn (vlib_main_t * vm, unformat_input_t * input)
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (input, "event-queue-length %d", &nitems))
if (unformat (input, "wrk-mq-length %d", &nitems))
{
if (nitems >= 2048)
smm->configured_event_queue_length = nitems;
smm->configured_wrk_mq_length = nitems;
else
clib_warning ("event queue length %d too small, ignored", nitems);
}
@ -2090,12 +2090,6 @@ session_config_fn (vlib_main_t * vm, unformat_input_t * input)
else if (unformat (input, "local-endpoints-table-buckets %d",
&smm->local_endpoints_table_buckets))
;
/* Deprecated but maintained for compatibility */
else if (unformat (input, "evt_qs_memfd_seg"))
;
else if (unformat (input, "evt_qs_seg_size %U", unformat_memory_size,
&smm->evt_qs_segment_size))
;
else if (unformat (input, "enable"))
smm->session_enable_asap = 1;
else if (unformat (input, "segment-baseva 0x%lx", &smm->session_baseva))
@ -2108,6 +2102,21 @@ session_config_fn (vlib_main_t * vm, unformat_input_t * input)
smm->use_private_rx_mqs = 1;
else if (unformat (input, "no-adaptive"))
smm->no_adaptive = 1;
/*
* Deprecated but maintained for compatibility
*/
else if (unformat (input, "evt_qs_memfd_seg"))
;
else if (unformat (input, "evt_qs_seg_size %U", unformat_memory_size,
&tmp))
;
else if (unformat (input, "event-queue-length %d", &nitems))
{
if (nitems >= 2048)
smm->configured_wrk_mq_length = nitems;
else
clib_warning ("event queue length %d too small, ignored", nitems);
}
else
return clib_error_return (0, "unknown input `%U'",
format_unformat_error, input);