From 0048223baad2b58a4e91aaeb2d05886499bbe004 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Fri, 2 Aug 2019 12:52:00 -0700 Subject: 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 --- src/vnet/session/session_node.c | 2 +- src/vnet/session/transport.c | 8 +++----- src/vnet/session/transport.h | 7 +++---- src/vnet/session/transport_types.h | 22 +++++++++++++--------- 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, -- cgit 1.2.3-korg