Message ID | 1335639894-18569-1-git-send-email-ycheng@google.com |
---|---|
State | Superseded, archived |
Delegated to: | David Miller |
Headers | show |
On Sat, Apr 28, 2012 at 3:04 PM, Yuchung Cheng <ycheng@google.com> wrote: > When the cwnd reduction is done, ssthresh may be infinite > if TCP enters CWR via ECN or F-RTO. If cwnd is not undone, i.e., > undo_marker is set, tcp_complete_cwr() falsely set cwnd to the > infinite ssthresh value. The correct operation is to keep cwnd > intact because it has been updated in ECN or F-RTO. > > Signed-off-by: Yuchung Cheng <ycheng@google.com> > --- > net/ipv4/tcp_input.c | 8 +++++--- > 1 files changed, 5 insertions(+), 3 deletions(-) > > diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c > index c93b0cb..ac417de 100644 > --- a/net/ipv4/tcp_input.c > +++ b/net/ipv4/tcp_input.c > @@ -2868,11 +2868,13 @@ static inline void tcp_complete_cwr(struct sock *sk) > > /* Do not moderate cwnd if it's already undone in cwr or recovery. */ > if (tp->undo_marker) { > - if (inet_csk(sk)->icsk_ca_state == TCP_CA_CWR) > + if (inet_csk(sk)->icsk_ca_state == TCP_CA_CWR) { > tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_ssthresh); In this TCP_CA_CWR case the patch needs to add the assignment: tp->snd_cwnd_stamp = tcp_time_stamp; I know that was in earlier versions of your patch; looks like it just got accidentally dropped on this latest version. Otherwise, looks good to me. neal -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index c93b0cb..ac417de 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -2868,11 +2868,13 @@ static inline void tcp_complete_cwr(struct sock *sk) /* Do not moderate cwnd if it's already undone in cwr or recovery. */ if (tp->undo_marker) { - if (inet_csk(sk)->icsk_ca_state == TCP_CA_CWR) + if (inet_csk(sk)->icsk_ca_state == TCP_CA_CWR) { tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_ssthresh); - else /* PRR */ + } else if (tp->snd_ssthresh < TCP_INFINITE_SSTHRESH) { + /* PRR algorithm. */ tp->snd_cwnd = tp->snd_ssthresh; - tp->snd_cwnd_stamp = tcp_time_stamp; + tp->snd_cwnd_stamp = tcp_time_stamp; + } } tcp_ca_event(sk, CA_EVENT_COMPLETE_CWR); }
When the cwnd reduction is done, ssthresh may be infinite if TCP enters CWR via ECN or F-RTO. If cwnd is not undone, i.e., undo_marker is set, tcp_complete_cwr() falsely set cwnd to the infinite ssthresh value. The correct operation is to keep cwnd intact because it has been updated in ECN or F-RTO. Signed-off-by: Yuchung Cheng <ycheng@google.com> --- net/ipv4/tcp_input.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-)