Page MenuHomeFreeBSD

D25976.diff
No OneTemporary

D25976.diff

Index: head/sys/netinet/cc/cc_cubic.c
===================================================================
--- head/sys/netinet/cc/cc_cubic.c
+++ head/sys/netinet/cc/cc_cubic.c
@@ -286,8 +286,7 @@
if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
cubic_ssthresh_update(ccv);
cubic_data->flags |= CUBICFLAG_CONG_EVENT;
- cubic_data->prev_max_cwnd = cubic_data->max_cwnd;
- cubic_data->max_cwnd = CCV(ccv, snd_cwnd);
+ cubic_data->t_last_cong = ticks;
cubic_data->K = cubic_k(cubic_data->max_cwnd / CCV(ccv, t_maxseg));
}
ENTER_RECOVERY(CCV(ccv, t_flags));
@@ -298,8 +297,6 @@
if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
cubic_ssthresh_update(ccv);
cubic_data->flags |= CUBICFLAG_CONG_EVENT;
- cubic_data->prev_max_cwnd = cubic_data->max_cwnd;
- cubic_data->max_cwnd = CCV(ccv, snd_cwnd);
cubic_data->t_last_cong = ticks;
cubic_data->K = cubic_k(cubic_data->max_cwnd / CCV(ccv, t_maxseg));
CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
@@ -361,11 +358,6 @@
cubic_data = ccv->cc_data;
pipe = 0;
- /* Fast convergence heuristic. */
- if (cubic_data->max_cwnd < cubic_data->prev_max_cwnd)
- cubic_data->max_cwnd = (cubic_data->max_cwnd * CUBIC_FC_FACTOR)
- >> CUBIC_SHIFT;
-
if (IN_FASTRECOVERY(CCV(ccv, t_flags))) {
/*
* If inflight data is less than ssthresh, set cwnd
@@ -392,7 +384,6 @@
CUBIC_BETA) >> CUBIC_SHIFT,
2 * CCV(ccv, t_maxseg));
}
- cubic_data->t_last_cong = ticks;
/* Calculate the average RTT between congestion epochs. */
if (cubic_data->epoch_ack_count > 0 &&
@@ -403,7 +394,6 @@
cubic_data->epoch_ack_count = 0;
cubic_data->sum_rtt_ticks = 0;
- cubic_data->K = cubic_k(cubic_data->max_cwnd / CCV(ccv, t_maxseg));
}
/*
@@ -457,18 +447,32 @@
{
struct cubic *cubic_data;
uint32_t ssthresh;
+ uint32_t cwnd;
cubic_data = ccv->cc_data;
+ cwnd = CCV(ccv, snd_cwnd);
+ /* Fast convergence heuristic. */
+ if (cwnd < cubic_data->max_cwnd) {
+ cwnd = ((uint64_t)cwnd * CUBIC_FC_FACTOR) >> CUBIC_SHIFT;
+ }
+ cubic_data->prev_max_cwnd = cubic_data->max_cwnd;
+ cubic_data->max_cwnd = cwnd;
+
/*
- * On the first congestion event, set ssthresh to cwnd * 0.5, on
- * subsequent congestion events, set it to cwnd * beta.
+ * On the first congestion event, set ssthresh to cwnd * 0.5
+ * and reduce max_cwnd to cwnd * beta. This aligns the cubic concave
+ * region appropriately. On subsequent congestion events, set
+ * ssthresh to cwnd * beta.
*/
- if ((cubic_data->flags & CUBICFLAG_CONG_EVENT) == 0)
- ssthresh = CCV(ccv, snd_cwnd) >> 1;
- else
- ssthresh = ((uint64_t)CCV(ccv, snd_cwnd) *
+ if ((cubic_data->flags & CUBICFLAG_CONG_EVENT) == 0) {
+ ssthresh = cwnd >> 1;
+ cubic_data->max_cwnd = ((uint64_t)cwnd *
CUBIC_BETA) >> CUBIC_SHIFT;
+ } else {
+ ssthresh = ((uint64_t)cwnd *
+ CUBIC_BETA) >> CUBIC_SHIFT;
+ }
CCV(ccv, snd_ssthresh) = max(ssthresh, 2 * CCV(ccv, t_maxseg));
}

File Metadata

Mime Type
text/plain
Expires
Sun, Oct 26, 3:20 PM (15 h, 5 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24236002
Default Alt Text
D25976.diff (2 KB)

Event Timeline