TCP: Update time_now once per burst 40/8040/3
authorFlorin Coras <[email protected]>
Mon, 14 Aug 2017 15:10:42 +0000 (08:10 -0700)
committerDave Barach <[email protected]>
Mon, 14 Aug 2017 21:26:32 +0000 (21:26 +0000)
Change-Id: I58089d7a9867ede9d8a36b2aea62edef04cb5b81
Signed-off-by: Florin Coras <[email protected]>
src/vnet/tcp/tcp.c
src/vnet/tcp/tcp.h
src/vnet/tcp/tcp_input.c
src/vnet/tcp/tcp_output.c

index 4652618..10ecf2f 100644 (file)
@@ -1299,6 +1299,8 @@ tcp_main_enable (vlib_main_t * vm)
 
   tm->bytes_per_buffer = vlib_buffer_free_list_buffer_size
     (vm, VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX);
+
+  vec_validate (tm->time_now, num_threads - 1);
   return error;
 }
 
index a17262f..52610dd 100644 (file)
@@ -367,6 +367,7 @@ typedef struct _tcp_main
 
   u8 log2_tstamp_clocks_per_tick;
   f64 tstamp_ticks_per_clock;
+  u32 *time_now;
 
   /** per-worker tx buffer free lists */
   u32 **tx_buffers;
@@ -619,12 +620,21 @@ void tcp_update_sack_list (tcp_connection_t * tc, u32 start, u32 end);
 always_inline u32
 tcp_time_now (void)
 {
-  return clib_cpu_time_now () * tcp_main.tstamp_ticks_per_clock;
+  return tcp_main.time_now[vlib_get_thread_index ()];
+}
+
+always_inline u32
+tcp_set_time_now (u32 thread_index)
+{
+  tcp_main.time_now[thread_index] = clib_cpu_time_now ()
+    * tcp_main.tstamp_ticks_per_clock;
+  return tcp_main.time_now[thread_index];
 }
 
 always_inline void
 tcp_update_time (f64 now, u32 thread_index)
 {
+  tcp_set_time_now (thread_index);
   tw_timer_expire_timers_16t_2w_512sl (&tcp_main.timer_wheels[thread_index],
                                       now);
   tcp_flush_frames_to_output (thread_index);
index a3b48d8..2d36c85 100644 (file)
@@ -2801,8 +2801,8 @@ tcp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
 
   from = vlib_frame_vector_args (from_frame);
   n_left_from = from_frame->n_vectors;
-
   next_index = node->cached_next_index;
+  tcp_set_time_now (my_thread_index);
 
   while (n_left_from > 0)
     {
index 4c1add2..5a395b9 100644 (file)
@@ -1621,8 +1621,8 @@ tcp46_output_inline (vlib_main_t * vm,
 
   from = vlib_frame_vector_args (from_frame);
   n_left_from = from_frame->n_vectors;
-
   next_index = node->cached_next_index;
+  tcp_set_time_now (my_thread_index);
 
   while (n_left_from > 0)
     {