|
@@ -475,8 +475,22 @@ extern unsigned int tcp_current_mss(struct sock *sk);
|
|
/* Bound MSS / TSO packet size with the half of the window */
|
|
/* Bound MSS / TSO packet size with the half of the window */
|
|
static inline int tcp_bound_to_half_wnd(struct tcp_sock *tp, int pktsize)
|
|
static inline int tcp_bound_to_half_wnd(struct tcp_sock *tp, int pktsize)
|
|
{
|
|
{
|
|
- if (tp->max_window && pktsize > (tp->max_window >> 1))
|
|
|
|
- return max(tp->max_window >> 1, 68U - tp->tcp_header_len);
|
|
|
|
|
|
+ int cutoff;
|
|
|
|
+
|
|
|
|
+ /* When peer uses tiny windows, there is no use in packetizing
|
|
|
|
+ * to sub-MSS pieces for the sake of SWS or making sure there
|
|
|
|
+ * are enough packets in the pipe for fast recovery.
|
|
|
|
+ *
|
|
|
|
+ * On the other hand, for extremely large MSS devices, handling
|
|
|
|
+ * smaller than MSS windows in this way does make sense.
|
|
|
|
+ */
|
|
|
|
+ if (tp->max_window >= 512)
|
|
|
|
+ cutoff = (tp->max_window >> 1);
|
|
|
|
+ else
|
|
|
|
+ cutoff = tp->max_window;
|
|
|
|
+
|
|
|
|
+ if (cutoff && pktsize > cutoff)
|
|
|
|
+ return max_t(int, cutoff, 68U - tp->tcp_header_len);
|
|
else
|
|
else
|
|
return pktsize;
|
|
return pktsize;
|
|
}
|
|
}
|