tcp: add helper for AI algorithm
It seems that implementation in yeah was inconsistent to what other did as it would increase cwnd one ack earlier than the others do. Size benefits: bictcp_cong_avoid | -36 tcp_cong_avoid_ai | +52 bictcp_cong_avoid | -34 tcp_scalable_cong_avoid | -36 tcp_veno_cong_avoid | -12 tcp_yeah_cong_avoid | -38 = -104 bytes total Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
571a5dd8d0
Коммит
758ce5c8d1
|
@ -685,6 +685,7 @@ extern void tcp_get_allowed_congestion_control(char *buf, size_t len);
|
|||
extern int tcp_set_allowed_congestion_control(char *allowed);
|
||||
extern int tcp_set_congestion_control(struct sock *sk, const char *name);
|
||||
extern void tcp_slow_start(struct tcp_sock *tp);
|
||||
extern void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w);
|
||||
|
||||
extern struct tcp_congestion_ops tcp_init_congestion_ops;
|
||||
extern u32 tcp_reno_ssthresh(struct sock *sk);
|
||||
|
|
|
@ -149,16 +149,7 @@ static void bictcp_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
|
|||
tcp_slow_start(tp);
|
||||
else {
|
||||
bictcp_update(ca, tp->snd_cwnd);
|
||||
|
||||
/* In dangerous area, increase slowly.
|
||||
* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd
|
||||
*/
|
||||
if (tp->snd_cwnd_cnt >= ca->cnt) {
|
||||
if (tp->snd_cwnd < tp->snd_cwnd_clamp)
|
||||
tp->snd_cwnd++;
|
||||
tp->snd_cwnd_cnt = 0;
|
||||
} else
|
||||
tp->snd_cwnd_cnt++;
|
||||
tcp_cong_avoid_ai(tp, ca->cnt);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -336,6 +336,19 @@ void tcp_slow_start(struct tcp_sock *tp)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(tcp_slow_start);
|
||||
|
||||
/* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd (or alternative w) */
|
||||
void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w)
|
||||
{
|
||||
if (tp->snd_cwnd_cnt >= w) {
|
||||
if (tp->snd_cwnd < tp->snd_cwnd_clamp)
|
||||
tp->snd_cwnd++;
|
||||
tp->snd_cwnd_cnt = 0;
|
||||
} else {
|
||||
tp->snd_cwnd_cnt++;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tcp_cong_avoid_ai);
|
||||
|
||||
/*
|
||||
* TCP Reno congestion control
|
||||
* This is special case used for fallback as well.
|
||||
|
@ -365,13 +378,7 @@ void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
|
|||
tp->snd_cwnd++;
|
||||
}
|
||||
} else {
|
||||
/* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd */
|
||||
if (tp->snd_cwnd_cnt >= tp->snd_cwnd) {
|
||||
if (tp->snd_cwnd < tp->snd_cwnd_clamp)
|
||||
tp->snd_cwnd++;
|
||||
tp->snd_cwnd_cnt = 0;
|
||||
} else
|
||||
tp->snd_cwnd_cnt++;
|
||||
tcp_cong_avoid_ai(tp, tp->snd_cwnd);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tcp_reno_cong_avoid);
|
||||
|
|
|
@ -294,16 +294,7 @@ static void bictcp_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
|
|||
tcp_slow_start(tp);
|
||||
} else {
|
||||
bictcp_update(ca, tp->snd_cwnd);
|
||||
|
||||
/* In dangerous area, increase slowly.
|
||||
* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd
|
||||
*/
|
||||
if (tp->snd_cwnd_cnt >= ca->cnt) {
|
||||
if (tp->snd_cwnd < tp->snd_cwnd_clamp)
|
||||
tp->snd_cwnd++;
|
||||
tp->snd_cwnd_cnt = 0;
|
||||
} else
|
||||
tp->snd_cwnd_cnt++;
|
||||
tcp_cong_avoid_ai(tp, ca->cnt);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -24,14 +24,8 @@ static void tcp_scalable_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
|
|||
|
||||
if (tp->snd_cwnd <= tp->snd_ssthresh)
|
||||
tcp_slow_start(tp);
|
||||
else {
|
||||
tp->snd_cwnd_cnt++;
|
||||
if (tp->snd_cwnd_cnt > min(tp->snd_cwnd, TCP_SCALABLE_AI_CNT)){
|
||||
if (tp->snd_cwnd < tp->snd_cwnd_clamp)
|
||||
tp->snd_cwnd++;
|
||||
tp->snd_cwnd_cnt = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
tcp_cong_avoid_ai(tp, min(tp->snd_cwnd, TCP_SCALABLE_AI_CNT));
|
||||
}
|
||||
|
||||
static u32 tcp_scalable_ssthresh(struct sock *sk)
|
||||
|
|
|
@ -159,12 +159,7 @@ static void tcp_veno_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
|
|||
/* In the "non-congestive state", increase cwnd
|
||||
* every rtt.
|
||||
*/
|
||||
if (tp->snd_cwnd_cnt >= tp->snd_cwnd) {
|
||||
if (tp->snd_cwnd < tp->snd_cwnd_clamp)
|
||||
tp->snd_cwnd++;
|
||||
tp->snd_cwnd_cnt = 0;
|
||||
} else
|
||||
tp->snd_cwnd_cnt++;
|
||||
tcp_cong_avoid_ai(tp, tp->snd_cwnd);
|
||||
} else {
|
||||
/* In the "congestive state", increase cwnd
|
||||
* every other rtt.
|
||||
|
|
|
@ -94,14 +94,7 @@ static void tcp_yeah_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
|
|||
|
||||
} else {
|
||||
/* Reno */
|
||||
|
||||
if (tp->snd_cwnd_cnt < tp->snd_cwnd)
|
||||
tp->snd_cwnd_cnt++;
|
||||
|
||||
if (tp->snd_cwnd_cnt >= tp->snd_cwnd) {
|
||||
tp->snd_cwnd++;
|
||||
tp->snd_cwnd_cnt = 0;
|
||||
}
|
||||
tcp_cong_avoid_ai(tp, tp->snd_cwnd);
|
||||
}
|
||||
|
||||
/* The key players are v_vegas.beg_snd_una and v_beg_snd_nxt.
|
||||
|
|
Загрузка…
Ссылка в новой задаче