session: cache align transport base class 39/21039/5
authorFlorin Coras <fcoras@cisco.com>
Fri, 2 Aug 2019 19:52:00 +0000 (12:52 -0700)
committerDave Wallace <dwallacelf@gmail.com>
Mon, 5 Aug 2019 16:24:45 +0000 (16:24 +0000)
Type:refactor

Also remove tx stats. Expectation is that transports will keep track of
them.

Change-Id: I083b328d87d0ad3688b630ddb5ef97827a4dbc2b
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/vnet/session/session_node.c
src/vnet/session/transport.c
src/vnet/session/transport.h
src/vnet/session/transport_types.h

index bffae62..c2e3dd0 100644 (file)
@@ -780,7 +780,7 @@ session_tx_fifo_read_and_snd_i (session_worker_t * wrk,
     vlib_buffer_free (vm, wrk->tx_buffers, n_bufs);
 
   *n_tx_packets += ctx->n_segs_per_evt;
-  transport_connection_update_tx_stats (ctx->tc, ctx->max_len_to_snd);
+  transport_connection_update_tx_bytes (ctx->tc, ctx->max_len_to_snd);
   vlib_put_next_frame (vm, node, next_index, n_left_to_next);
 
   SESSION_EVT (SESSION_EVT_DEQ, ctx->s, ctx->max_len_to_snd, ctx->max_dequeue,
index bb4c681..22a356e 100644 (file)
@@ -605,9 +605,8 @@ format_transport_pacer (u8 * s, va_list * args)
 {
   spacer_t *pacer = va_arg (*args, spacer_t *);
 
-  s = format (s, "bucket %u max_burst %u tokens/period %.3f last_update %x",
-             pacer->bucket, pacer->max_burst_size, pacer->tokens_per_period,
-             pacer->last_update);
+  s = format (s, "bucket %u tokens/period %.3f last_update %x",
+             pacer->bucket, pacer->tokens_per_period, pacer->last_update);
   return s;
 }
 
@@ -709,9 +708,8 @@ transport_connection_tx_pacer_rate (transport_connection_t * tc)
 }
 
 void
-transport_connection_update_tx_stats (transport_connection_t * tc, u32 bytes)
+transport_connection_update_tx_bytes (transport_connection_t * tc, u32 bytes)
 {
-  tc->stats.tx_bytes += bytes;
   if (transport_connection_is_tx_paced (tc))
     spacer_update_bucket (&tc->pacer, bytes);
 }
index 058a9ae..c4f74eb 100644 (file)
@@ -237,16 +237,15 @@ transport_connection_is_tx_paced (transport_connection_t * tc)
 u8 *format_transport_pacer (u8 * s, va_list * args);
 
 /**
- * Update tx byte stats for transport connection
+ * Update tx bytes for paced transport connection
  *
- * If tx pacing is enabled, this also updates pacer bucket to account for the
+ * If tx pacing is enabled, this update pacer bucket to account for the
  * amount of bytes that have been sent.
  *
  * @param tc           transport connection
- * @param pkts         packets recently sent
  * @param bytes                bytes recently sent
  */
-void transport_connection_update_tx_stats (transport_connection_t * tc,
+void transport_connection_update_tx_bytes (transport_connection_t * tc,
                                           u32 bytes);
 
 void
index 224c820..41897c6 100644 (file)
@@ -47,17 +47,11 @@ typedef enum transport_connection_flags_
                                                  transports using the network layer (udp/tcp) */
 } transport_connection_flags_t;
 
-typedef struct _transport_stats
-{
-  u64 tx_bytes;
-} transport_stats_t;
-
 typedef struct _spacer
 {
   u64 bucket;
-  u32 max_burst_size;
-  f32 tokens_per_period;
   u64 last_update;
+  f32 tokens_per_period;
 } spacer_t;
 
 #define TRANSPORT_CONN_ID_LEN  44
@@ -77,9 +71,9 @@ typedef struct _transport_connection
     {
       ip46_address_t rmt_ip;   /**< Remote IP */
       ip46_address_t lcl_ip;   /**< Local IP */
+      u32 fib_index;           /**< Network namespace */
       u16 rmt_port;            /**< Remote port */
       u16 lcl_port;            /**< Local port */
-      u32 fib_index;           /**< Network namespace */
       u8 is_ip4;               /**< Flag if IP4 connection */
       u8 proto;                        /**< Protocol id */
       u8 unused[2];            /**< First field after id wants to be
@@ -99,7 +93,6 @@ typedef struct _transport_connection
   /*fib_node_index_t rmt_fei;
      dpo_id_t rmt_dpo; */
 
-  transport_stats_t stats;     /**< Transport connection stats */
   spacer_t pacer;              /**< Simple transport pacer */
 
 #if TRANSPORT_DEBUG
@@ -107,6 +100,12 @@ typedef struct _transport_connection
   u32 cc_stat_tstamp;          /**< CC stats timestamp */
 #endif
 
+  /**
+   * Transport specific state starts in next cache line. Meant to avoid
+   * alignment surprises in transports when base class changes.
+   */
+    CLIB_CACHE_LINE_ALIGN_MARK (end);
+
   /** Macros for 'derived classes' where base is named "connection" */
 #define c_lcl_ip connection.lcl_ip
 #define c_rmt_ip connection.rmt_ip
@@ -135,6 +134,11 @@ typedef struct _transport_connection
 STATIC_ASSERT (STRUCT_OFFSET_OF (transport_connection_t, s_index)
               == TRANSPORT_CONN_ID_LEN, "update conn id len");
 
+/* Warn if size changes. Two cache lines is already generous, hopefully we
+ * won't have to outgrow that. */
+STATIC_ASSERT (sizeof (transport_connection_t) <= 128,
+              "moved into 3rd cache line");
+
 typedef enum _transport_proto
 {
   TRANSPORT_PROTO_TCP,