summaryrefslogtreecommitdiffstats
path: root/src/vnet/tcp/tcp_output.c
diff options
context:
space:
mode:
authorliuyacan <liuyacan@corp.netease.com>2021-06-14 18:09:01 +0800
committerFlorin Coras <florin.coras@gmail.com>2021-06-15 05:27:32 +0000
commit7e78119c257579731c8902556b4a197c3fc3e92e (patch)
tree2b8d7512b16aeb4ee76bfa3c0f47bf8a8a61afe7 /src/vnet/tcp/tcp_output.c
parent4d37bf9821d469f2c96ec3b2ddf8940320d9aa69 (diff)
tcp: prevent timer handler being called frequently
In the current implement, tcp would start or up an one tick retransmit timer for that connection if vlib_buffer_alloc() return 0. Now the tick is 0.1ms, this means that if VPP is in a buffer shortage state, there would be a large number of burst timer expirations. This commit limits the minimum interval of the retransmission timer to 100ms. Type: fix Signed-off-by: liuyacan <liuyacan@corp.netease.com> Change-Id: Ia11d693fe46119c5dc16b24ca93c30c31109057a
Diffstat (limited to 'src/vnet/tcp/tcp_output.c')
-rw-r--r--src/vnet/tcp/tcp_output.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/vnet/tcp/tcp_output.c b/src/vnet/tcp/tcp_output.c
index bde06da87ed..0ba349c2a62 100644
--- a/src/vnet/tcp/tcp_output.c
+++ b/src/vnet/tcp/tcp_output.c
@@ -820,7 +820,8 @@ tcp_send_syn (tcp_connection_t * tc)
if (PREDICT_FALSE (!vlib_buffer_alloc (vm, &bi, 1)))
{
- tcp_timer_update (&wrk->timer_wheel, tc, TCP_TIMER_RETRANSMIT_SYN, 1);
+ tcp_timer_update (&wrk->timer_wheel, tc, TCP_TIMER_RETRANSMIT_SYN,
+ tcp_cfg.alloc_err_timeout);
tcp_worker_stats_inc (wrk, no_buffer, 1);
return;
}
@@ -852,7 +853,8 @@ tcp_send_synack (tcp_connection_t * tc)
if (PREDICT_FALSE (!vlib_buffer_alloc (vm, &bi, 1)))
{
- tcp_timer_update (&wrk->timer_wheel, tc, TCP_TIMER_RETRANSMIT, 1);
+ tcp_timer_update (&wrk->timer_wheel, tc, TCP_TIMER_RETRANSMIT,
+ tcp_cfg.alloc_err_timeout);
tcp_worker_stats_inc (wrk, no_buffer, 1);
return;
}
@@ -884,7 +886,8 @@ tcp_send_fin (tcp_connection_t * tc)
if (PREDICT_FALSE (!vlib_buffer_alloc (vm, &bi, 1)))
{
/* Out of buffers so program fin retransmit ASAP */
- tcp_timer_update (&wrk->timer_wheel, tc, TCP_TIMER_RETRANSMIT, 1);
+ tcp_timer_update (&wrk->timer_wheel, tc, TCP_TIMER_RETRANSMIT,
+ tcp_cfg.alloc_err_timeout);
if (fin_snt)
tc->snd_nxt += 1;
else
@@ -1374,7 +1377,8 @@ tcp_timer_retransmit_handler (tcp_connection_t * tc)
n_bytes = tcp_prepare_retransmit_segment (wrk, tc, 0, n_bytes, &b);
if (!n_bytes)
{
- tcp_timer_update (&wrk->timer_wheel, tc, TCP_TIMER_RETRANSMIT, 1);
+ tcp_timer_update (&wrk->timer_wheel, tc, TCP_TIMER_RETRANSMIT,
+ tcp_cfg.alloc_err_timeout);
return;
}
@@ -1416,7 +1420,8 @@ tcp_timer_retransmit_handler (tcp_connection_t * tc)
if (PREDICT_FALSE (!vlib_buffer_alloc (vm, &bi, 1)))
{
- tcp_timer_update (&wrk->timer_wheel, tc, TCP_TIMER_RETRANSMIT, 1);
+ tcp_timer_update (&wrk->timer_wheel, tc, TCP_TIMER_RETRANSMIT,
+ tcp_cfg.alloc_err_timeout);
tcp_worker_stats_inc (wrk, no_buffer, 1);
return;
}
@@ -1481,7 +1486,8 @@ tcp_timer_retransmit_syn_handler (tcp_connection_t * tc)
if (PREDICT_FALSE (!vlib_buffer_alloc (vm, &bi, 1)))
{
- tcp_timer_update (&wrk->timer_wheel, tc, TCP_TIMER_RETRANSMIT_SYN, 1);
+ tcp_timer_update (&wrk->timer_wheel, tc, TCP_TIMER_RETRANSMIT_SYN,
+ tcp_cfg.alloc_err_timeout);
tcp_worker_stats_inc (wrk, no_buffer, 1);
return;
}