diff options
| -rw-r--r-- | include/net/tcp.h | 4 | ||||
| -rw-r--r-- | net/ipv4/tcp_bic.c | 7 | ||||
| -rw-r--r-- | net/ipv4/tcp_compound.c | 1 | ||||
| -rw-r--r-- | net/ipv4/tcp_cong.c | 6 | ||||
| -rw-r--r-- | net/ipv4/tcp_cubic.c | 6 | ||||
| -rw-r--r-- | net/ipv4/tcp_htcp.c | 9 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 13 | ||||
| -rw-r--r-- | net/ipv4/tcp_veno.c | 7 | ||||
| -rw-r--r-- | net/ipv4/tcp_westwood.c | 18 | 
9 files changed, 23 insertions, 48 deletions
diff --git a/include/net/tcp.h b/include/net/tcp.h index f1f472746e6..de88c5472bf 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -632,7 +632,7 @@ struct tcp_congestion_ops {  	/* return slow start threshold (required) */  	u32 (*ssthresh)(struct sock *sk);  	/* lower bound for congestion window (optional) */ -	u32 (*min_cwnd)(struct sock *sk); +	u32 (*min_cwnd)(const struct sock *sk);  	/* do new cwnd calculation (required) */  	void (*cong_avoid)(struct sock *sk, u32 ack,  			   u32 rtt, u32 in_flight, int good_ack); @@ -667,7 +667,7 @@ extern struct tcp_congestion_ops tcp_init_congestion_ops;  extern u32 tcp_reno_ssthresh(struct sock *sk);  extern void tcp_reno_cong_avoid(struct sock *sk, u32 ack,  				u32 rtt, u32 in_flight, int flag); -extern u32 tcp_reno_min_cwnd(struct sock *sk); +extern u32 tcp_reno_min_cwnd(const struct sock *sk);  extern struct tcp_congestion_ops tcp_reno;  static inline void tcp_set_ca_state(struct sock *sk, const u8 ca_state) diff --git a/net/ipv4/tcp_bic.c b/net/ipv4/tcp_bic.c index 035f2092d73..b2d9021ad22 100644 --- a/net/ipv4/tcp_bic.c +++ b/net/ipv4/tcp_bic.c @@ -198,12 +198,6 @@ static u32 bictcp_undo_cwnd(struct sock *sk)  	return max(tp->snd_cwnd, ca->last_max_cwnd);  } -static u32 bictcp_min_cwnd(struct sock *sk) -{ -	const struct tcp_sock *tp = tcp_sk(sk); -	return tp->snd_ssthresh; -} -  static void bictcp_state(struct sock *sk, u8 new_state)  {  	if (new_state == TCP_CA_Loss) @@ -231,7 +225,6 @@ static struct tcp_congestion_ops bictcp = {  	.cong_avoid	= bictcp_cong_avoid,  	.set_state	= bictcp_state,  	.undo_cwnd	= bictcp_undo_cwnd, -	.min_cwnd	= bictcp_min_cwnd,  	.pkts_acked     = bictcp_acked,  	.owner		= THIS_MODULE,  	.name		= "bic", diff --git a/net/ipv4/tcp_compound.c b/net/ipv4/tcp_compound.c index ec68cb8081c..bc54f7e9aea 100644 --- a/net/ipv4/tcp_compound.c +++ b/net/ipv4/tcp_compound.c @@ -419,7 +419,6 @@ static struct tcp_congestion_ops tcp_compound = {  	.init		= tcp_compound_init,  	.ssthresh	= tcp_reno_ssthresh,  	.cong_avoid	= tcp_compound_cong_avoid, -	.min_cwnd	= tcp_reno_min_cwnd,  	.rtt_sample	= tcp_compound_rtt_calc,  	.set_state	= tcp_compound_state,  	.cwnd_event	= tcp_compound_cwnd_event, diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index 91c2f41c7f5..857eefc52aa 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c @@ -38,7 +38,7 @@ int tcp_register_congestion_control(struct tcp_congestion_ops *ca)  	int ret = 0;  	/* all algorithms must implement ssthresh and cong_avoid ops */ -	if (!ca->ssthresh || !ca->cong_avoid || !ca->min_cwnd) { +	if (!ca->ssthresh || !ca->cong_avoid) {  		printk(KERN_ERR "TCP %s does not implement required ops\n",  		       ca->name);  		return -EINVAL; @@ -251,8 +251,8 @@ u32 tcp_reno_ssthresh(struct sock *sk)  }  EXPORT_SYMBOL_GPL(tcp_reno_ssthresh); -/* Lower bound on congestion window. */ -u32 tcp_reno_min_cwnd(struct sock *sk) +/* Lower bound on congestion window with halving. */ +u32 tcp_reno_min_cwnd(const struct sock *sk)  {  	const struct tcp_sock *tp = tcp_sk(sk);  	return tp->snd_ssthresh/2; diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c index 31a4986dfbf..78b7a6b9e4d 100644 --- a/net/ipv4/tcp_cubic.c +++ b/net/ipv4/tcp_cubic.c @@ -325,11 +325,6 @@ static u32 bictcp_undo_cwnd(struct sock *sk)  	return max(tcp_sk(sk)->snd_cwnd, ca->last_max_cwnd);  } -static u32 bictcp_min_cwnd(struct sock *sk) -{ -	return tcp_sk(sk)->snd_ssthresh; -} -  static void bictcp_state(struct sock *sk, u8 new_state)  {  	if (new_state == TCP_CA_Loss) @@ -357,7 +352,6 @@ static struct tcp_congestion_ops cubictcp = {  	.cong_avoid	= bictcp_cong_avoid,  	.set_state	= bictcp_state,  	.undo_cwnd	= bictcp_undo_cwnd, -	.min_cwnd	= bictcp_min_cwnd,  	.pkts_acked     = bictcp_acked,  	.owner		= THIS_MODULE,  	.name		= "cubic", diff --git a/net/ipv4/tcp_htcp.c b/net/ipv4/tcp_htcp.c index 1b2ff53f98e..3d92c185926 100644 --- a/net/ipv4/tcp_htcp.c +++ b/net/ipv4/tcp_htcp.c @@ -246,14 +246,6 @@ static void htcp_cong_avoid(struct sock *sk, u32 ack, u32 rtt,  	}  } -/* Lower bound on congestion window. */ -static u32 htcp_min_cwnd(struct sock *sk) -{ -	const struct tcp_sock *tp = tcp_sk(sk); -	return tp->snd_ssthresh; -} - -  static void htcp_init(struct sock *sk)  {  	struct htcp *ca = inet_csk_ca(sk); @@ -285,7 +277,6 @@ static void htcp_state(struct sock *sk, u8 new_state)  static struct tcp_congestion_ops htcp = {  	.init		= htcp_init,  	.ssthresh	= htcp_recalc_ssthresh, -	.min_cwnd	= htcp_min_cwnd,  	.cong_avoid	= htcp_cong_avoid,  	.set_state	= htcp_state,  	.undo_cwnd	= htcp_cwnd_undo, diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 6d167889a4b..e08245bdda3 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -1689,17 +1689,26 @@ static inline void tcp_moderate_cwnd(struct tcp_sock *tp)  	tp->snd_cwnd_stamp = tcp_time_stamp;  } +/* Lower bound on congestion window is slow start threshold + * unless congestion avoidance choice decides to overide it. + */ +static inline u32 tcp_cwnd_min(const struct sock *sk) +{ +	const struct tcp_congestion_ops *ca_ops = inet_csk(sk)->icsk_ca_ops; + +	return ca_ops->min_cwnd ? ca_ops->min_cwnd(sk) : tcp_sk(sk)->snd_ssthresh; +} +  /* Decrease cwnd each second ack. */  static void tcp_cwnd_down(struct sock *sk)  { -	const struct inet_connection_sock *icsk = inet_csk(sk);  	struct tcp_sock *tp = tcp_sk(sk);  	int decr = tp->snd_cwnd_cnt + 1;  	tp->snd_cwnd_cnt = decr&1;  	decr >>= 1; -	if (decr && tp->snd_cwnd > icsk->icsk_ca_ops->min_cwnd(sk)) +	if (decr && tp->snd_cwnd > tcp_cwnd_min(sk))  		tp->snd_cwnd -= decr;  	tp->snd_cwnd = min(tp->snd_cwnd, tcp_packets_in_flight(tp)+1); diff --git a/net/ipv4/tcp_veno.c b/net/ipv4/tcp_veno.c index 1091671751c..11b42a7135c 100644 --- a/net/ipv4/tcp_veno.c +++ b/net/ipv4/tcp_veno.c @@ -199,17 +199,10 @@ static u32 tcp_veno_ssthresh(struct sock *sk)  		return max(tp->snd_cwnd >> 1U, 2U);  } -static u32 tcp_veno_min_cwnd(struct sock * sk) -{ -	const struct tcp_sock *tp = tcp_sk(sk); -	return tp->snd_ssthresh; -} -  static struct tcp_congestion_ops tcp_veno = {  	.init		= tcp_veno_init,  	.ssthresh	= tcp_veno_ssthresh,  	.cong_avoid	= tcp_veno_cong_avoid, -	.min_cwnd 	= tcp_veno_min_cwnd,  	.rtt_sample	= tcp_veno_rtt_calc,  	.set_state	= tcp_veno_state,  	.cwnd_event	= tcp_veno_cwnd_event, diff --git a/net/ipv4/tcp_westwood.c b/net/ipv4/tcp_westwood.c index 0c340c3756c..29eb258b6d8 100644 --- a/net/ipv4/tcp_westwood.c +++ b/net/ipv4/tcp_westwood.c @@ -162,12 +162,6 @@ static inline u32 westwood_acked_count(struct sock *sk)  	return w->cumul_ack;  } -static inline u32 westwood_bw_rttmin(const struct sock *sk) -{ -	const struct tcp_sock *tp = tcp_sk(sk); -	const struct westwood *w = inet_csk_ca(sk); -	return max_t(u32, (w->bw_est * w->rtt_min) / tp->mss_cache, 2); -}  /*   * TCP Westwood @@ -175,9 +169,11 @@ static inline u32 westwood_bw_rttmin(const struct sock *sk)   * in packets we use mss_cache). Rttmin is guaranteed to be >= 2   * so avoids ever returning 0.   */ -static u32 tcp_westwood_cwnd_min(struct sock *sk) +static u32 tcp_westwood_bw_rttmin(const struct sock *sk)  { -	return westwood_bw_rttmin(sk); +	const struct tcp_sock *tp = tcp_sk(sk); +	const struct westwood *w = inet_csk_ca(sk); +	return max_t(u32, (w->bw_est * w->rtt_min) / tp->mss_cache, 2);  }  static void tcp_westwood_event(struct sock *sk, enum tcp_ca_event event) @@ -191,11 +187,11 @@ static void tcp_westwood_event(struct sock *sk, enum tcp_ca_event event)  		break;  	case CA_EVENT_COMPLETE_CWR: -		tp->snd_cwnd = tp->snd_ssthresh = westwood_bw_rttmin(sk); +		tp->snd_cwnd = tp->snd_ssthresh = tcp_westwood_bw_rttmin(sk);  		break;  	case CA_EVENT_FRTO: -		tp->snd_ssthresh = westwood_bw_rttmin(sk); +		tp->snd_ssthresh = tcp_westwood_bw_rttmin(sk);  		break;  	case CA_EVENT_SLOW_ACK: @@ -235,7 +231,7 @@ static struct tcp_congestion_ops tcp_westwood = {  	.init		= tcp_westwood_init,  	.ssthresh	= tcp_reno_ssthresh,  	.cong_avoid	= tcp_reno_cong_avoid, -	.min_cwnd	= tcp_westwood_cwnd_min, +	.min_cwnd	= tcp_westwood_bw_rttmin,  	.cwnd_event	= tcp_westwood_event,  	.get_info	= tcp_westwood_info,  	.pkts_acked	= tcp_westwood_pkts_acked,  |