diff options
Diffstat (limited to 'net/ipv4/tcp_dctcp.c')
| -rw-r--r-- | net/ipv4/tcp_dctcp.c | 36 | 
1 files changed, 18 insertions, 18 deletions
| diff --git a/net/ipv4/tcp_dctcp.c b/net/ipv4/tcp_dctcp.c index cd4814f7e962..359da68d7c06 100644 --- a/net/ipv4/tcp_dctcp.c +++ b/net/ipv4/tcp_dctcp.c @@ -67,11 +67,6 @@ static unsigned int dctcp_alpha_on_init __read_mostly = DCTCP_MAX_ALPHA;  module_param(dctcp_alpha_on_init, uint, 0644);  MODULE_PARM_DESC(dctcp_alpha_on_init, "parameter for initial alpha value"); -static unsigned int dctcp_clamp_alpha_on_loss __read_mostly; -module_param(dctcp_clamp_alpha_on_loss, uint, 0644); -MODULE_PARM_DESC(dctcp_clamp_alpha_on_loss, -		 "parameter for clamping alpha on loss"); -  static struct tcp_congestion_ops dctcp_reno;  static void dctcp_reset(const struct tcp_sock *tp, struct dctcp *ca) @@ -164,21 +159,23 @@ static void dctcp_update_alpha(struct sock *sk, u32 flags)  	}  } -static void dctcp_state(struct sock *sk, u8 new_state) +static void dctcp_react_to_loss(struct sock *sk)  { -	if (dctcp_clamp_alpha_on_loss && new_state == TCP_CA_Loss) { -		struct dctcp *ca = inet_csk_ca(sk); +	struct dctcp *ca = inet_csk_ca(sk); +	struct tcp_sock *tp = tcp_sk(sk); -		/* If this extension is enabled, we clamp dctcp_alpha to -		 * max on packet loss; the motivation is that dctcp_alpha -		 * is an indicator to the extend of congestion and packet -		 * loss is an indicator of extreme congestion; setting -		 * this in practice turned out to be beneficial, and -		 * effectively assumes total congestion which reduces the -		 * window by half. -		 */ -		ca->dctcp_alpha = DCTCP_MAX_ALPHA; -	} +	ca->loss_cwnd = tp->snd_cwnd; +	tp->snd_ssthresh = max(tp->snd_cwnd >> 1U, 2U); +} + +static void dctcp_state(struct sock *sk, u8 new_state) +{ +	if (new_state == TCP_CA_Recovery && +	    new_state != inet_csk(sk)->icsk_ca_state) +		dctcp_react_to_loss(sk); +	/* We handle RTO in dctcp_cwnd_event to ensure that we perform only +	 * one loss-adjustment per RTT. +	 */  }  static void dctcp_cwnd_event(struct sock *sk, enum tcp_ca_event ev) @@ -190,6 +187,9 @@ static void dctcp_cwnd_event(struct sock *sk, enum tcp_ca_event ev)  	case CA_EVENT_ECN_NO_CE:  		dctcp_ece_ack_update(sk, ev, &ca->prior_rcv_nxt, &ca->ce_state);  		break; +	case CA_EVENT_LOSS: +		dctcp_react_to_loss(sk); +		break;  	default:  		/* Don't care for the rest. */  		break; |