diff options
Diffstat (limited to 'net/ipv4/tcp_cubic.c')
| -rw-r--r-- | net/ipv4/tcp_cubic.c | 9 | 
1 files changed, 7 insertions, 2 deletions
diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c index 34340c9c95f..f376b05cca8 100644 --- a/net/ipv4/tcp_cubic.c +++ b/net/ipv4/tcp_cubic.c @@ -93,6 +93,7 @@ struct bictcp {  	u32	ack_cnt;	/* number of acks */  	u32	tcp_cwnd;	/* estimated tcp cwnd */  #define ACK_RATIO_SHIFT	4 +#define ACK_RATIO_LIMIT (32u << ACK_RATIO_SHIFT)  	u16	delayed_ack;	/* estimate the ratio of Packets/ACKs << 4 */  	u8	sample_cnt;	/* number of samples to decide curr_rtt */  	u8	found;		/* the exit point is found? */ @@ -398,8 +399,12 @@ static void bictcp_acked(struct sock *sk, u32 cnt, s32 rtt_us)  	u32 delay;  	if (icsk->icsk_ca_state == TCP_CA_Open) { -		cnt -= ca->delayed_ack >> ACK_RATIO_SHIFT; -		ca->delayed_ack += cnt; +		u32 ratio = ca->delayed_ack; + +		ratio -= ca->delayed_ack >> ACK_RATIO_SHIFT; +		ratio += cnt; + +		ca->delayed_ack = min(ratio, ACK_RATIO_LIMIT);  	}  	/* Some calls are for duplicates without timetamps */  |