X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ftcp%2Ftcp.c;h=1fb95b3ad3aea1428d86ef52832f716f9b2d9b81;hb=776f3d85ebd4edfb70b0f748890f1efd98d8474c;hp=bdf9c7af6083ff74ca5eda203a9604f558013ad8;hpb=e55a6d7a97044c2f4fd0231242e062924d75c7b6;p=vpp.git diff --git a/src/vnet/tcp/tcp.c b/src/vnet/tcp/tcp.c index bdf9c7af608..1fb95b3ad3a 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 @@ -1153,7 +1153,7 @@ const static transport_proto_vft_t tcp_proto = { /* *INDENT-ON* */ void -tcp_update_pacer (tcp_connection_t * tc) +tcp_connection_tx_pacer_update (tcp_connection_t * tc) { f64 srtt; @@ -1165,6 +1165,17 @@ tcp_update_pacer (tcp_connection_t * tc) ((f64) tc->cwnd) / srtt); } +void +tcp_connection_tx_pacer_reset (tcp_connection_t * tc, u32 window, + u32 start_bucket) +{ + tcp_worker_ctx_t *wrk = tcp_get_worker (tc->c_thread_index); + u32 byte_rate = window / ((f64) TCP_TICK * tc->srtt); + u64 last_time = wrk->vm->clib_time.last_cpu_time; + transport_connection_tx_pacer_reset (&tc->connection, byte_rate, + start_bucket, last_time); +} + static void tcp_timer_keep_handler (u32 conn_index) { @@ -1291,13 +1302,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 +1330,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 +1342,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); } /* @@ -1797,6 +1798,12 @@ tcp_scoreboard_replay (u8 * s, tcp_connection_t * tc, u8 verbose) tcp_connection_t _dummy_tc, *dummy_tc = &_dummy_tc; sack_block_t *block; + if (!TCP_SCOREBOARD_TRACE) + { + s = format (s, "scoreboard tracing not enabled"); + return s; + } + if (!tc) return s; @@ -1805,13 +1812,7 @@ tcp_scoreboard_replay (u8 * s, tcp_connection_t * tc, u8 verbose) scoreboard_init (&dummy_tc->sack_sb); dummy_tc->rcv_opts.flags |= TCP_OPTS_FLAG_SACK; -/* Since this is also accessible via decl. in tcp.h. - * Otherwise, it is gated earlier by cli parser. - */ -#if (!TCP_SCOREBOARD_TRACE) - s = format (0, "scoreboard tracing not enabled"); - return s; -#else +#if TCP_SCOREBOARD_TRACE trace = tc->sack_sb.trace; trace_len = vec_len (tc->sack_sb.trace); #endif