X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ftcp%2Ftcp.c;h=1726355f0e3e0ee22536ec9ea1c58ad09a06e8f8;hb=be72ae6149a432899698a887b1820cf5c9d9456f;hp=bdf9c7af6083ff74ca5eda203a9604f558013ad8;hpb=bf9f02cd395387bc596f1dab5e3566f6c5573eda;p=vpp.git diff --git a/src/vnet/tcp/tcp.c b/src/vnet/tcp/tcp.c index bdf9c7af608..1726355f0e3 100644 --- a/src/vnet/tcp/tcp.c +++ b/src/vnet/tcp/tcp.c @@ -546,7 +546,7 @@ tcp_init_snd_vars (tcp_connection_t * tc) * handshake may make it look as if time has flown in the opposite * direction for us. */ - tcp_set_time_now (vlib_get_thread_index ()); + tcp_set_time_now (tcp_get_worker (vlib_get_thread_index ())); time_now = tcp_time_now (); tc->iss = random_u32 (&time_now); @@ -1113,12 +1113,12 @@ tcp_session_tx_fifo_offset (transport_connection_t * trans_conn) static void tcp_update_time (f64 now, u8 thread_index) { - tcp_set_time_now (thread_index); - tw_timer_expire_timers_16t_2w_512sl (&tcp_main. - wrk_ctx[thread_index].timer_wheel, - now); - tcp_do_fastretransmits (thread_index); - tcp_flush_frames_to_output (thread_index); + tcp_worker_ctx_t *wrk = tcp_get_worker (thread_index); + + tcp_set_time_now (wrk); + tw_timer_expire_timers_16t_2w_512sl (&wrk->timer_wheel, now); + tcp_do_fastretransmits (wrk); + tcp_flush_frames_to_output (wrk); } static u32 @@ -1291,13 +1291,12 @@ tcp_initialize_timer_wheels (tcp_main_t * tm) static clib_error_t * tcp_main_enable (vlib_main_t * vm) { - tcp_main_t *tm = vnet_get_tcp_main (); vlib_thread_main_t *vtm = vlib_get_thread_main (); + u32 num_threads, n_workers, prealloc_conn_per_wrk; + tcp_connection_t *tc __attribute__ ((unused)); + tcp_main_t *tm = vnet_get_tcp_main (); clib_error_t *error = 0; - u32 num_threads; int thread; - tcp_connection_t *tc __attribute__ ((unused)); - u32 preallocated_connections_per_thread; if ((error = vlib_call_init_function (vm, ip_main_init))) return error; @@ -1320,27 +1319,11 @@ tcp_main_enable (vlib_main_t * vm) num_threads = 1 /* main thread */ + vtm->n_threads; vec_validate (tm->connections, num_threads - 1); vec_validate (tm->wrk_ctx, num_threads - 1); + n_workers = num_threads == 1 ? 1 : vtm->n_threads; + prealloc_conn_per_wrk = tm->preallocated_connections / n_workers; - /* - * Preallocate connections. Assume that thread 0 won't - * use preallocated threads when running multi-core - */ - if (num_threads == 1) + for (thread = 0; thread < num_threads; thread++) { - thread = 0; - preallocated_connections_per_thread = tm->preallocated_connections; - } - else - { - thread = 1; - preallocated_connections_per_thread = - tm->preallocated_connections / (num_threads - 1); - } - for (; thread < num_threads; thread++) - { - if (preallocated_connections_per_thread) - pool_init_fixed (tm->connections[thread], - preallocated_connections_per_thread); vec_validate (tm->wrk_ctx[thread].pending_fast_rxt, 0); vec_validate (tm->wrk_ctx[thread].ongoing_fast_rxt, 0); vec_validate (tm->wrk_ctx[thread].postponed_fast_rxt, 0); @@ -1348,6 +1331,13 @@ tcp_main_enable (vlib_main_t * vm) vec_reset_length (tm->wrk_ctx[thread].ongoing_fast_rxt); vec_reset_length (tm->wrk_ctx[thread].postponed_fast_rxt); tm->wrk_ctx[thread].vm = vlib_mains[thread]; + + /* + * Preallocate connections. Assume that thread 0 won't + * use preallocated threads when running multi-core + */ + if ((thread > 0 || num_threads == 1) && prealloc_conn_per_wrk) + pool_init_fixed (tm->connections[thread], prealloc_conn_per_wrk); } /*