|
@@ -229,7 +229,8 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
|
|
|
*/
|
|
|
tcp_reno_cong_avoid(sk, ack, in_flight);
|
|
|
} else {
|
|
|
- u32 rtt, target_cwnd, diff;
|
|
|
+ u32 rtt, diff;
|
|
|
+ u64 target_cwnd;
|
|
|
|
|
|
/* We have enough RTT samples, so, using the Vegas
|
|
|
* algorithm, we determine if we should increase or
|
|
@@ -252,8 +253,9 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
|
|
|
* We keep it as a fixed point number with
|
|
|
* V_PARAM_SHIFT bits to the right of the binary point.
|
|
|
*/
|
|
|
- target_cwnd = ((old_wnd * vegas->baseRTT)
|
|
|
- << V_PARAM_SHIFT) / rtt;
|
|
|
+ target_cwnd = ((u64)old_wnd * vegas->baseRTT);
|
|
|
+ target_cwnd <<= V_PARAM_SHIFT;
|
|
|
+ do_div(target_cwnd, rtt);
|
|
|
|
|
|
/* Calculate the difference between the window we had,
|
|
|
* and the window we would like to have. This quantity
|
|
@@ -279,7 +281,7 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
|
|
|
* utilization.
|
|
|
*/
|
|
|
tp->snd_cwnd = min(tp->snd_cwnd,
|
|
|
- (target_cwnd >>
|
|
|
+ ((u32)target_cwnd >>
|
|
|
V_PARAM_SHIFT)+1);
|
|
|
|
|
|
} else if (tp->snd_cwnd <= tp->snd_ssthresh) {
|