|
@@ -1096,10 +1096,14 @@ static int tcp_tso_should_defer(struct sock *sk, struct tcp_sock *tp, struct sk_
|
|
u32 send_win, cong_win, limit, in_flight;
|
|
u32 send_win, cong_win, limit, in_flight;
|
|
|
|
|
|
if (TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN)
|
|
if (TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN)
|
|
- return 0;
|
|
|
|
|
|
+ goto send_now;
|
|
|
|
|
|
if (icsk->icsk_ca_state != TCP_CA_Open)
|
|
if (icsk->icsk_ca_state != TCP_CA_Open)
|
|
- return 0;
|
|
|
|
|
|
+ goto send_now;
|
|
|
|
+
|
|
|
|
+ /* Defer for less than two clock ticks. */
|
|
|
|
+ if (!tp->tso_deferred && ((jiffies<<1)>>1) - (tp->tso_deferred>>1) > 1)
|
|
|
|
+ goto send_now;
|
|
|
|
|
|
in_flight = tcp_packets_in_flight(tp);
|
|
in_flight = tcp_packets_in_flight(tp);
|
|
|
|
|
|
@@ -1115,7 +1119,7 @@ static int tcp_tso_should_defer(struct sock *sk, struct tcp_sock *tp, struct sk_
|
|
|
|
|
|
/* If a full-sized TSO skb can be sent, do it. */
|
|
/* If a full-sized TSO skb can be sent, do it. */
|
|
if (limit >= 65536)
|
|
if (limit >= 65536)
|
|
- return 0;
|
|
|
|
|
|
+ goto send_now;
|
|
|
|
|
|
if (sysctl_tcp_tso_win_divisor) {
|
|
if (sysctl_tcp_tso_win_divisor) {
|
|
u32 chunk = min(tp->snd_wnd, tp->snd_cwnd * tp->mss_cache);
|
|
u32 chunk = min(tp->snd_wnd, tp->snd_cwnd * tp->mss_cache);
|
|
@@ -1125,7 +1129,7 @@ static int tcp_tso_should_defer(struct sock *sk, struct tcp_sock *tp, struct sk_
|
|
*/
|
|
*/
|
|
chunk /= sysctl_tcp_tso_win_divisor;
|
|
chunk /= sysctl_tcp_tso_win_divisor;
|
|
if (limit >= chunk)
|
|
if (limit >= chunk)
|
|
- return 0;
|
|
|
|
|
|
+ goto send_now;
|
|
} else {
|
|
} else {
|
|
/* Different approach, try not to defer past a single
|
|
/* Different approach, try not to defer past a single
|
|
* ACK. Receiver should ACK every other full sized
|
|
* ACK. Receiver should ACK every other full sized
|
|
@@ -1133,11 +1137,17 @@ static int tcp_tso_should_defer(struct sock *sk, struct tcp_sock *tp, struct sk_
|
|
* then send now.
|
|
* then send now.
|
|
*/
|
|
*/
|
|
if (limit > tcp_max_burst(tp) * tp->mss_cache)
|
|
if (limit > tcp_max_burst(tp) * tp->mss_cache)
|
|
- return 0;
|
|
|
|
|
|
+ goto send_now;
|
|
}
|
|
}
|
|
|
|
|
|
/* Ok, it looks like it is advisable to defer. */
|
|
/* Ok, it looks like it is advisable to defer. */
|
|
|
|
+ tp->tso_deferred = 1 | (jiffies<<1);
|
|
|
|
+
|
|
return 1;
|
|
return 1;
|
|
|
|
+
|
|
|
|
+send_now:
|
|
|
|
+ tp->tso_deferred = 0;
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
/* Create a new MTU probe if we are ready.
|
|
/* Create a new MTU probe if we are ready.
|