diff options
| author | Stephen Hemminger <shemminger@osdl.org> | 2005-12-14 02:13:00 -0500 |
|---|---|---|
| committer | David S. Miller <davem@sunset.davemloft.net> | 2006-01-03 16:10:26 -0500 |
| commit | 018da8f44c066d5fc390011b8c953135f973b3a9 (patch) | |
| tree | 196fbd3028d166f7ac88e60019b6d3a56d16be13 /net/ipv4 | |
| parent | d28d1e080132f28ab773291f10ad6acca4c8bba2 (diff) | |
[TCP] BIC: remove low utilization code.
The latest BICTCP patch at:
http://www.csc.ncsu.edu:8080/faculty/rhee/export/bitcp/index_files/Page546.htm
disables the low_utilization feature of BICTCP because it doesn't work
in some cases. This patch removes it.
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
| -rw-r--r-- | net/ipv4/tcp_bic.c | 81 |
1 files changed, 1 insertions, 80 deletions
diff --git a/net/ipv4/tcp_bic.c b/net/ipv4/tcp_bic.c index 1d0cd86621b1..cf8c75f08efa 100644 --- a/net/ipv4/tcp_bic.c +++ b/net/ipv4/tcp_bic.c | |||
| @@ -30,8 +30,6 @@ static int fast_convergence = 1; | |||
| 30 | static int max_increment = 16; | 30 | static int max_increment = 16; |
| 31 | static int low_window = 14; | 31 | static int low_window = 14; |
| 32 | static int beta = 819; /* = 819/1024 (BICTCP_BETA_SCALE) */ | 32 | static int beta = 819; /* = 819/1024 (BICTCP_BETA_SCALE) */ |
| 33 | static int low_utilization_threshold = 153; | ||
| 34 | static int low_utilization_period = 2; | ||
| 35 | static int initial_ssthresh = 100; | 33 | static int initial_ssthresh = 100; |
| 36 | static int smooth_part = 20; | 34 | static int smooth_part = 20; |
| 37 | 35 | ||
| @@ -43,10 +41,6 @@ module_param(low_window, int, 0644); | |||
| 43 | MODULE_PARM_DESC(low_window, "lower bound on congestion window (for TCP friendliness)"); | 41 | MODULE_PARM_DESC(low_window, "lower bound on congestion window (for TCP friendliness)"); |
| 44 | module_param(beta, int, 0644); | 42 | module_param(beta, int, 0644); |
| 45 | MODULE_PARM_DESC(beta, "beta for multiplicative increase"); | 43 | MODULE_PARM_DESC(beta, "beta for multiplicative increase"); |
| 46 | module_param(low_utilization_threshold, int, 0644); | ||
| 47 | MODULE_PARM_DESC(low_utilization_threshold, "percent (scaled by 1024) for low utilization mode"); | ||
| 48 | module_param(low_utilization_period, int, 0644); | ||
| 49 | MODULE_PARM_DESC(low_utilization_period, "if average delay exceeds then goto to low utilization mode (seconds)"); | ||
| 50 | module_param(initial_ssthresh, int, 0644); | 44 | module_param(initial_ssthresh, int, 0644); |
| 51 | MODULE_PARM_DESC(initial_ssthresh, "initial value of slow start threshold"); | 45 | MODULE_PARM_DESC(initial_ssthresh, "initial value of slow start threshold"); |
| 52 | module_param(smooth_part, int, 0644); | 46 | module_param(smooth_part, int, 0644); |
| @@ -60,11 +54,6 @@ struct bictcp { | |||
| 60 | u32 loss_cwnd; /* congestion window at last loss */ | 54 | u32 loss_cwnd; /* congestion window at last loss */ |
| 61 | u32 last_cwnd; /* the last snd_cwnd */ | 55 | u32 last_cwnd; /* the last snd_cwnd */ |
| 62 | u32 last_time; /* time when updated last_cwnd */ | 56 | u32 last_time; /* time when updated last_cwnd */ |
| 63 | u32 delay_min; /* min delay */ | ||
| 64 | u32 delay_max; /* max delay */ | ||
| 65 | u32 last_delay; | ||
| 66 | u8 low_utilization;/* 0: high; 1: low */ | ||
| 67 | u32 low_utilization_start; /* starting time of low utilization detection*/ | ||
| 68 | u32 epoch_start; /* beginning of an epoch */ | 57 | u32 epoch_start; /* beginning of an epoch */ |
| 69 | #define ACK_RATIO_SHIFT 4 | 58 | #define ACK_RATIO_SHIFT 4 |
| 70 | u32 delayed_ack; /* estimate the ratio of Packets/ACKs << 4 */ | 59 | u32 delayed_ack; /* estimate the ratio of Packets/ACKs << 4 */ |
| @@ -77,11 +66,6 @@ static inline void bictcp_reset(struct bictcp *ca) | |||
| 77 | ca->loss_cwnd = 0; | 66 | ca->loss_cwnd = 0; |
| 78 | ca->last_cwnd = 0; | 67 | ca->last_cwnd = 0; |
| 79 | ca->last_time = 0; | 68 | ca->last_time = 0; |
| 80 | ca->delay_min = 0; | ||
| 81 | ca->delay_max = 0; | ||
| 82 | ca->last_delay = 0; | ||
| 83 | ca->low_utilization = 0; | ||
| 84 | ca->low_utilization_start = 0; | ||
| 85 | ca->epoch_start = 0; | 69 | ca->epoch_start = 0; |
| 86 | ca->delayed_ack = 2 << ACK_RATIO_SHIFT; | 70 | ca->delayed_ack = 2 << ACK_RATIO_SHIFT; |
| 87 | } | 71 | } |
| @@ -143,8 +127,7 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | |||
| 143 | } | 127 | } |
| 144 | 128 | ||
| 145 | /* if in slow start or link utilization is very low */ | 129 | /* if in slow start or link utilization is very low */ |
| 146 | if ( ca->loss_cwnd == 0 || | 130 | if (ca->loss_cwnd == 0) { |
| 147 | (cwnd > ca->loss_cwnd && ca->low_utilization)) { | ||
| 148 | if (ca->cnt > 20) /* increase cwnd 5% per RTT */ | 131 | if (ca->cnt > 20) /* increase cwnd 5% per RTT */ |
| 149 | ca->cnt = 20; | 132 | ca->cnt = 20; |
| 150 | } | 133 | } |
| @@ -154,69 +137,12 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | |||
| 154 | ca->cnt = 1; | 137 | ca->cnt = 1; |
| 155 | } | 138 | } |
| 156 | 139 | ||
| 157 | |||
| 158 | /* Detect low utilization in congestion avoidance */ | ||
| 159 | static inline void bictcp_low_utilization(struct sock *sk, int flag) | ||
| 160 | { | ||
| 161 | const struct tcp_sock *tp = tcp_sk(sk); | ||
| 162 | struct bictcp *ca = inet_csk_ca(sk); | ||
| 163 | u32 dist, delay; | ||
| 164 | |||
| 165 | /* No time stamp */ | ||
| 166 | if (!(tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr) || | ||
| 167 | /* Discard delay samples right after fast recovery */ | ||
| 168 | tcp_time_stamp < ca->epoch_start + HZ || | ||
| 169 | /* this delay samples may not be accurate */ | ||
| 170 | flag == 0) { | ||
| 171 | ca->last_delay = 0; | ||
| 172 | goto notlow; | ||
| 173 | } | ||
| 174 | |||
| 175 | delay = ca->last_delay<<3; /* use the same scale as tp->srtt*/ | ||
| 176 | ca->last_delay = tcp_time_stamp - tp->rx_opt.rcv_tsecr; | ||
| 177 | if (delay == 0) /* no previous delay sample */ | ||
| 178 | goto notlow; | ||
| 179 | |||
| 180 | /* first time call or link delay decreases */ | ||
| 181 | if (ca->delay_min == 0 || ca->delay_min > delay) { | ||
| 182 | ca->delay_min = ca->delay_max = delay; | ||
| 183 | goto notlow; | ||
| 184 | } | ||
| 185 | |||
| 186 | if (ca->delay_max < delay) | ||
| 187 | ca->delay_max = delay; | ||
| 188 | |||
| 189 | /* utilization is low, if avg delay < dist*threshold | ||
| 190 | for checking_period time */ | ||
| 191 | dist = ca->delay_max - ca->delay_min; | ||
| 192 | if (dist <= ca->delay_min>>6 || | ||
| 193 | tp->srtt - ca->delay_min >= (dist*low_utilization_threshold)>>10) | ||
| 194 | goto notlow; | ||
| 195 | |||
| 196 | if (ca->low_utilization_start == 0) { | ||
| 197 | ca->low_utilization = 0; | ||
| 198 | ca->low_utilization_start = tcp_time_stamp; | ||
| 199 | } else if ((s32)(tcp_time_stamp - ca->low_utilization_start) | ||
| 200 | > low_utilization_period*HZ) { | ||
| 201 | ca->low_utilization = 1; | ||
| 202 | } | ||
| 203 | |||
| 204 | return; | ||
| 205 | |||
| 206 | notlow: | ||
| 207 | ca->low_utilization = 0; | ||
| 208 | ca->low_utilization_start = 0; | ||
| 209 | |||
| 210 | } | ||
| 211 | |||
| 212 | static void bictcp_cong_avoid(struct sock *sk, u32 ack, | 140 | static void bictcp_cong_avoid(struct sock *sk, u32 ack, |
| 213 | u32 seq_rtt, u32 in_flight, int data_acked) | 141 | u32 seq_rtt, u32 in_flight, int data_acked) |
| 214 | { | 142 | { |
| 215 | struct tcp_sock *tp = tcp_sk(sk); | 143 | struct tcp_sock *tp = tcp_sk(sk); |
| 216 | struct bictcp *ca = inet_csk_ca(sk); | 144 | struct bictcp *ca = inet_csk_ca(sk); |
| 217 | 145 | ||
| 218 | bictcp_low_utilization(sk, data_acked); | ||
| 219 | |||
| 220 | if (!tcp_is_cwnd_limited(sk, in_flight)) | 146 | if (!tcp_is_cwnd_limited(sk, in_flight)) |
| 221 | return; | 147 | return; |
| 222 | 148 | ||
| @@ -249,11 +175,6 @@ static u32 bictcp_recalc_ssthresh(struct sock *sk) | |||
| 249 | 175 | ||
| 250 | ca->epoch_start = 0; /* end of epoch */ | 176 | ca->epoch_start = 0; /* end of epoch */ |
| 251 | 177 | ||
| 252 | /* in case of wrong delay_max*/ | ||
| 253 | if (ca->delay_min > 0 && ca->delay_max > ca->delay_min) | ||
| 254 | ca->delay_max = ca->delay_min | ||
| 255 | + ((ca->delay_max - ca->delay_min)* 90) / 100; | ||
| 256 | |||
| 257 | /* Wmax and fast convergence */ | 178 | /* Wmax and fast convergence */ |
| 258 | if (tp->snd_cwnd < ca->last_max_cwnd && fast_convergence) | 179 | if (tp->snd_cwnd < ca->last_max_cwnd && fast_convergence) |
| 259 | ca->last_max_cwnd = (tp->snd_cwnd * (BICTCP_BETA_SCALE + beta)) | 180 | ca->last_max_cwnd = (tp->snd_cwnd * (BICTCP_BETA_SCALE + beta)) |
