diff options
Diffstat (limited to 'src/vnet/session')
-rw-r--r-- | src/vnet/session/session_node.c | 15 | ||||
-rw-r--r-- | src/vnet/session/transport.h | 13 |
2 files changed, 26 insertions, 2 deletions
diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c index 1d7ebf9f11a..bebabd3d68e 100644 --- a/src/vnet/session/session_node.c +++ b/src/vnet/session/session_node.c @@ -1188,8 +1188,14 @@ session_tx_maybe_reschedule (session_worker_t * wrk, svm_fifo_unset_event (s->tx_fifo); if (svm_fifo_max_dequeue_cons (s->tx_fifo) > ctx->sp.tx_offset) - if (svm_fifo_set_event (s->tx_fifo)) - session_evt_add_head_old (wrk, elt); + { + if (svm_fifo_set_event (s->tx_fifo)) + session_evt_add_head_old (wrk, elt); + } + else + { + transport_connection_deschedule (ctx->tc); + } } always_inline int @@ -1246,6 +1252,11 @@ session_tx_fifo_read_and_snd_i (session_worker_t * wrk, } } + /* Connection previously descheduled because it had no data to send. + * Clear descheduled flag and reset pacer if in use */ + if (transport_connection_is_descheduled (ctx->tc)) + transport_connection_clear_descheduled (ctx->tc); + transport_connection_snd_params (ctx->tc, &ctx->sp); if (!ctx->sp.snd_space) diff --git a/src/vnet/session/transport.h b/src/vnet/session/transport.h index 2cfec06ec94..549f17957cc 100644 --- a/src/vnet/session/transport.h +++ b/src/vnet/session/transport.h @@ -327,6 +327,19 @@ transport_connection_is_tx_paced (transport_connection_t * tc) return (tc->flags & TRANSPORT_CONNECTION_F_IS_TX_PACED); } +/** + * Clear descheduled flag and update pacer if needed + * + * To add session to scheduler use @ref transport_connection_reschedule + */ +always_inline void +transport_connection_clear_descheduled (transport_connection_t *tc) +{ + tc->flags &= ~TRANSPORT_CONNECTION_F_DESCHED; + if (transport_connection_is_tx_paced (tc)) + transport_connection_tx_pacer_reset_bucket (tc, 0 /* bucket */); +} + u8 *format_transport_pacer (u8 * s, va_list * args); /** |