diff options
Diffstat (limited to 'src/vnet/session')
-rw-r--r-- | src/vnet/session/session_node.c | 47 |
1 files changed, 14 insertions, 33 deletions
diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c index 882c591b35a..57445a34c2d 100644 --- a/src/vnet/session/session_node.c +++ b/src/vnet/session/session_node.c @@ -379,8 +379,6 @@ session_tx_fifo_chain_tail (vlib_main_t * vm, session_tx_context_t * ctx, *n_bufs -= 1; chain_bi0 = wrk->tx_buffers[*n_bufs]; - _vec_len (wrk->tx_buffers) = *n_bufs; - chain_b = vlib_get_buffer (vm, chain_bi0); chain_b->current_data = 0; data = vlib_buffer_get_current (chain_b); @@ -434,20 +432,6 @@ session_tx_fifo_chain_tail (vlib_main_t * vm, session_tx_context_t * ctx, ctx->left_to_snd -= left_from_seg; } -always_inline int -session_output_try_get_buffers (vlib_main_t * vm, - session_manager_worker_t * wrk, - u32 thread_index, u16 * n_bufs, u32 wanted) -{ - u32 n_alloc; - vec_validate_aligned (wrk->tx_buffers, wanted - 1, CLIB_CACHE_LINE_BYTES); - n_alloc = vlib_buffer_alloc (vm, &wrk->tx_buffers[*n_bufs], - wanted - *n_bufs); - *n_bufs += n_alloc; - _vec_len (wrk->tx_buffers) = *n_bufs; - return n_alloc; -} - always_inline void session_tx_fill_buffer (vlib_main_t * vm, session_tx_context_t * ctx, vlib_buffer_t * b, u16 * n_bufs, u8 peek_data) @@ -636,9 +620,8 @@ session_tx_fifo_read_and_snd_i (vlib_main_t * vm, vlib_node_runtime_t * node, session_event_t * e, int *n_tx_packets, u8 peek_data) { - u32 next_index, next0, next1, *to_next, n_left_to_next; + u32 next_index, next0, next1, *to_next, n_left_to_next, n_left, pbi; u32 n_trace = vlib_get_trace_count (vm, node), n_bufs_needed = 0; - u32 thread_index = vm->thread_index, n_left, pbi; session_manager_main_t *smm = &session_manager_main; session_tx_context_t *ctx = &wrk->ctx; transport_proto_t tp; @@ -686,21 +669,16 @@ session_tx_fifo_read_and_snd_i (vlib_main_t * vm, vlib_node_runtime_t * node, if (PREDICT_FALSE (!ctx->max_len_to_snd)) return SESSION_TX_NO_DATA; - n_bufs = vec_len (wrk->tx_buffers); n_bufs_needed = ctx->n_segs_per_evt * ctx->n_bufs_per_seg; - - /* - * Make sure we have at least one full frame of buffers ready - */ - if (n_bufs < n_bufs_needed) + vec_validate_aligned (wrk->tx_buffers, n_bufs_needed - 1, + CLIB_CACHE_LINE_BYTES); + n_bufs = vlib_buffer_alloc (vm, wrk->tx_buffers, n_bufs_needed); + if (PREDICT_FALSE (n_bufs < n_bufs_needed)) { - session_output_try_get_buffers (vm, wrk, thread_index, &n_bufs, - ctx->n_bufs_per_seg * VLIB_FRAME_SIZE); - if (PREDICT_FALSE (n_bufs < n_bufs_needed)) - { - vec_add1 (wrk->pending_event_vector, *e); - return SESSION_TX_NO_BUFFERS; - } + if (n_bufs) + vlib_buffer_free (vm, wrk->tx_buffers, n_bufs); + vec_add1 (wrk->pending_event_vector, *e); + return SESSION_TX_NO_BUFFERS; } /* @@ -783,8 +761,11 @@ session_tx_fifo_read_and_snd_i (vlib_main_t * vm, vlib_node_runtime_t * node, if (PREDICT_FALSE (n_trace > 0)) session_tx_trace_frame (vm, node, next_index, to_next, ctx->n_segs_per_evt, ctx->s, n_trace); - - _vec_len (wrk->tx_buffers) = n_bufs; + if (PREDICT_FALSE (n_bufs)) + { + clib_warning ("not all buffers consumed"); + 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); vlib_put_next_frame (vm, node, next_index, n_left_to_next); |