summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2019-08-02 12:52:00 -0700
committerDave Wallace <dwallacelf@gmail.com>2019-08-05 16:24:45 +0000
commit0048223baad2b58a4e91aaeb2d05886499bbe004 (patch)
treeb4990152bdda07f93b99e5fc75e4421353f53417
parent470b2a61659d76c1fc03352d42af6f3f3945330f (diff)
session: cache align transport base class
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>
-rw-r--r--src/vnet/session/session_node.c2
-rw-r--r--src/vnet/session/transport.c8
-rw-r--r--src/vnet/session/transport.h7
-rw-r--r--src/vnet/session/transport_types.h22
4 files changed, 20 insertions, 19 deletions
diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c
index bffae62ff79..c2e3dd005a8 100644
--- a/src/vnet/session/session_node.c
+++ b/src/vnet/session/session_node.c
@@ -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,
diff --git a/src/vnet/session/transport.c b/src/vnet/session/transport.c
index bb4c6817345..22a356eaae2 100644
--- a/src/vnet/session/transport.c
+++ b/src/vnet/session/transport.c
@@ -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);
}
diff --git a/src/vnet/session/transport.h b/src/vnet/session/transport.h
index 058a9aee34c..c4f74ebe991 100644
--- a/src/vnet/session/transport.h
+++ b/src/vnet/session/transport.h
@@ -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
diff --git a/src/vnet/session/transport_types.h b/src/vnet/session/transport_types.h
index 224c8202e73..41897c6d170 100644
--- a/src/vnet/session/transport_types.h
+++ b/src/vnet/session/transport_types.h
@@ -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,