summaryrefslogtreecommitdiffstats
path: root/src/vnet/session
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2017-11-29 00:07:11 -0500
committerDamjan Marion <dmarion.lists@gmail.com>2017-11-29 11:59:46 +0000
commit93e658058033e251b98d18a1f0717a07a85adfc2 (patch)
tree469bda92e663851b7925aa60fd8677d38a5e6a86 /src/vnet/session
parentc6fb36fc2eb43c6158b390918d295f2c8eba737b (diff)
session: fix preallocation of local endpoint table
Change-Id: I67a73e31bda9e497859297fcc1765e880572884a Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vnet/session')
-rw-r--r--src/vnet/session/session.c11
-rw-r--r--src/vnet/session/session.h26
-rw-r--r--src/vnet/session/session_node.c5
-rw-r--r--src/vnet/session/transport.c12
4 files changed, 40 insertions, 14 deletions
diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c
index d995eeb04a5..b1bd7a7f041 100644
--- a/src/vnet/session/session.c
+++ b/src/vnet/session/session.c
@@ -1239,6 +1239,17 @@ session_config_fn (vlib_main_t * vm, unformat_input_t * input)
tmp, tmp);
smm->configured_v6_halfopen_table_memory = tmp;
}
+ else if (unformat (input, "local-endpoints-table-memory %U",
+ unformat_memory_size, &tmp))
+ {
+ if (tmp >= 0x100000000)
+ return clib_error_return (0, "memory size %llx (%lld) too large",
+ tmp, tmp);
+ smm->local_endpoints_table_memory = tmp;
+ }
+ else if (unformat (input, "local-endpoints-table-buckets %d",
+ &smm->local_endpoints_table_buckets))
+ ;
else
return clib_error_return (0, "unknown input `%U'",
format_unformat_error, input);
diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h
index 2a0b0cc47bd..d7bb18e4127 100644
--- a/src/vnet/session/session.h
+++ b/src/vnet/session/session.h
@@ -140,7 +140,7 @@ struct _session_manager_main
stream_session_t *listen_sessions[SESSION_N_TYPES];
/** Per-proto, per-worker enqueue epoch counters */
- u8 *current_enqueue_epoch[TRANSPORT_N_PROTO];
+ u32 *current_enqueue_epoch[TRANSPORT_N_PROTO];
/** Per-proto, per-worker thread vector of sessions to enqueue */
u32 **session_to_enqueue[TRANSPORT_N_PROTO];
@@ -160,9 +160,22 @@ struct _session_manager_main
/** vpp fifo event queue */
unix_shared_memory_queue_t **vpp_event_queues;
+ /** Unique segment name counter */
+ u32 unique_segment_name_counter;
+
+ /** Per transport rx function that can either dequeue or peek */
+ session_fifo_rx_fn *session_tx_fns[SESSION_N_TYPES];
+
+ /** Session manager is enabled */
+ u8 is_enabled;
+
/** vpp fifo event queue configured length */
u32 configured_event_queue_length;
+ /*
+ * Config parameters
+ */
+
/** session table size parameters */
u32 configured_v4_session_table_buckets;
u32 configured_v4_session_table_memory;
@@ -173,14 +186,9 @@ struct _session_manager_main
u32 configured_v6_halfopen_table_buckets;
u32 configured_v6_halfopen_table_memory;
- /** Unique segment name counter */
- u32 unique_segment_name_counter;
-
- /** Per transport rx function that can either dequeue or peek */
- session_fifo_rx_fn *session_tx_fns[SESSION_N_TYPES];
-
- /** Session manager is enabled */
- u8 is_enabled;
+ /** Transport table (preallocation) size parameters */
+ u32 local_endpoints_table_memory;
+ u32 local_endpoints_table_buckets;
/** Preallocate session config parameter */
u32 preallocated_sessions;
diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c
index f647360ea5b..08baa447864 100644
--- a/src/vnet/session/session_node.c
+++ b/src/vnet/session/session_node.c
@@ -629,7 +629,10 @@ skip_dequeue:
/* Can retransmit for closed sessions but can't do anything if
* session is not ready or closed */
if (PREDICT_FALSE (s0->session_state < SESSION_STATE_READY))
- continue;
+ {
+ vec_add1 (smm->pending_event_vector[my_thread_index], *e0);
+ continue;
+ }
/* Spray packets in per session type frames, since they go to
* different nodes */
rv = (smm->session_tx_fns[s0->session_type]) (vm, node, smm, e0, s0,
diff --git a/src/vnet/session/transport.c b/src/vnet/session/transport.c
index c18cf15974e..b0a5906383d 100644
--- a/src/vnet/session/transport.c
+++ b/src/vnet/session/transport.c
@@ -314,16 +314,20 @@ void
transport_init (void)
{
vlib_thread_main_t *vtm = vlib_get_thread_main ();
- u32 local_endpoints_table_buckets = 250000;
- u32 local_endpoints_table_memory = 512 << 20;
+ session_manager_main_t *smm = vnet_get_session_manager_main ();
u32 num_threads;
+ if (smm->local_endpoints_table_buckets == 0)
+ smm->local_endpoints_table_buckets = 250000;
+ if (smm->local_endpoints_table_memory == 0)
+ smm->local_endpoints_table_memory = 512 << 20;
+
/* Initialize [port-allocator] random number seed */
port_allocator_seed = (u32) clib_cpu_time_now ();
clib_bihash_init_24_8 (&local_endpoints_table, "local endpoints table",
- local_endpoints_table_buckets,
- local_endpoints_table_memory);
+ smm->local_endpoints_table_buckets,
+ smm->local_endpoints_table_memory);
num_threads = 1 /* main thread */ + vtm->n_threads;
if (num_threads > 1)
clib_spinlock_init (&local_endpoints_lock);